sql >> データベース >  >> RDS >> SQLite

複数のテーブルを操作するためのベストプラクティス

    データベース名/作成ステートメントおよびその他の共有情報を使用して抽象基本クラスを作成し、それをすべてのテーブルに拡張することに成功しました。このようにして、すべてのCRUDメソッドを分離しておくことができます(私はこれを非常に好みます)。唯一の欠点は、DATABASE_CREATEステートメントが親クラスに存在する必要があり、後で新しいテーブルを追加できないため、すべてのテーブルを含める必要があることですが、私の意見では、CRUDを維持するために支払うのは少額です。各テーブルのメソッドは個別です。

    これを行うのはかなり簡単でしたが、ここにいくつかの注意事項があります:

    • 親クラスのcreateステートメントは必須 db.execSQLは複数のステートメントを実行できないため、テーブルごとに分割されます。
    • 念のため、すべてのプライベート変数/メソッドを保護に変更しました。
    • 既存のアプリケーションにテーブルを追加する場合(これがエミュレーターに固有のものかどうかはわかりません)、アプリケーションをアンインストールしてから再インストールする必要があります。

    これは、メモ帳のチュートリアルに基づいた、私の抽象的な親クラスのコードです。子供たちはこれを拡張して、スーパーのコンストラクターを呼び出します(これを自由に使用してください):

    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();
        }
    
    }
    

    もう少し詳細な説明はここにあります:http://pheide.com/page/11/tab/24#post13



    1. MySQLでユーザーを作成する

    2. データベース設計における不十分な慣行

    3. PHPでPostgreSQLに接続できないpg_connect()

    4. Oracleで主キー列にインデックスを付ける必要があります