SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Các phương pháp hay nhất để làm việc với nhiều bảng

Tôi đã thành công với việc tạo một lớp cơ sở trừu tượng với tên cơ sở dữ liệu / câu lệnh tạo và thông tin được chia sẻ khác, sau đó mở rộng nó cho mọi bảng. Bằng cách này, tôi có thể giữ tất cả các phương pháp CRUD của mình riêng biệt (mà tôi thích hơn). Nhược điểm duy nhất là (các) câu lệnh DATABASE_CREATE phải nằm trong lớp cha và phải bao gồm tất cả các bảng, vì không thể thêm bảng mới sau đó, nhưng theo tôi đó là một cái giá nhỏ phải trả để giữ CRUD các phương thức cho từng bảng riêng biệt.

Thực hiện việc này khá đơn giản, nhưng đây là một số lưu ý:

  • Câu lệnh create trong lớp cha must được chia nhỏ cho từng bảng, vì db.execSQL không thể thực thi nhiều hơn một câu lệnh.
  • Tôi đã thay đổi tất cả các vars / phương thức riêng tư thành được bảo vệ, đề phòng trường hợp xảy ra.
  • Nếu bạn đang thêm các bảng vào một ứng dụng hiện có (không chắc liệu điều này có dành riêng cho trình mô phỏng hay không), ứng dụng đó phải được gỡ cài đặt rồi cài đặt lại.

Đây là mã cho lớp cha trừu tượng của tôi, dựa trên Hướng dẫn sử dụng Notepad. Các con chỉ cần mở rộng điều này, gọi hàm tạo của siêu cấp (cứ thoải mái sử dụng):

package com.pheide.trainose;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public abstract class AbstractDbAdapter {

    protected static final String TAG = "TrainOseDbAdapter";
    protected DatabaseHelper mDbHelper;
    protected SQLiteDatabase mDb;

    protected static final String TABLE_CREATE_ROUTES =
        "create table routes (_id integer primary key autoincrement, "
        + "source text not null, destination text not null);";
    protected static final String TABLE_CREATE_TIMETABLES =    
        "create table timetables (_id integer primary key autoincrement, "
        + "route_id integer, depart text not null, arrive text not null, "
        + "train text not null);";

    protected static final String DATABASE_NAME = "data";
    protected static final int DATABASE_VERSION = 2;

    protected final Context mCtx;

    protected static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(TABLE_CREATE_ROUTES);
            db.execSQL(TABLE_CREATE_TIMETABLES);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS routes");
            onCreate(db);
        }
    }

    public AbstractDbAdapter(Context ctx) {
        this.mCtx = ctx;
    }

    public AbstractDbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }

}

Giải thích chi tiết hơn một chút có sẵn tại đây:http://pheide.com/page/11/tab/24#post13



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể truy cập cơ sở dữ liệu SQLite được điền sẵn bằng PhoneGap / Cordova trong Android

  2. Cập nhật tất cả các hàng trong một cột thành giá trị mới

  3. Bao gồm tên cột trong kết quả truy vấn SQLite

  4. Cạm bẫy và bẫy SQLite

  5. Làm thế nào để tạo bảng bằng cơ sở dữ liệu sqlite trong Android?