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

データベース内のテーブルごとにSQLiteOpenHelperを継承するクラスを作成する必要がありますか?

    データベース内のすべてのテーブルに必要なデータベースヘルパーは1つだけなので、 onCreateを1つ使用します。 テーブルの作成方法。複数のデータベースヘルパーがある場合は、 onCreate (および onUpdate メソッド)は、データベースを開いた最初のヘルパーによって1回だけ呼び出されるため、複数のヘルパーが非効率的であることに加えて、複数のデータベースヘルパーを使用する方が複雑になる可能性があります。

    より具体的には、 onCreate データベースが存在しない場合にのみ自動的に呼び出されます。 onCreateまでに データベース自体が作成されたと呼ばれます。

    onUpdate データベースを開いたときに(スーパーコールを介して)呼び出しに渡されたバージョン番号が、データベースファイルに格納されているバージョン番号よりも大きい場合にのみ呼び出されます。この時点でファイルに保存されているバージョン番号は、新しいバージョンを反映するように更新されます。したがって、後続の呼び出しは onUpgradeを呼び出しません。 メソッド。

    個々のテーブルの列/テーブル名など、メソッドと識別子を分割するかどうかは、選択できます。分割するのは厄介だと考える人もいれば、より明確だと思う人もいます。

    次のコードは、すべて2つのテーブル、つまり table001 を利用する3つの順列(およびデータベース)の例です。 (列 _id およびmydata )および table001 (列名 _id およびmyotherdata

    1. ヘルパー内にすべてが埋め込まれた単一のdatabaseHelper(DBHelper001)を使用します。データベースはmydb001

    2. 単一のデータベースヘルパー(DBHelper002)を使用し、特定のテーブル指向クラス(クラスTable001およびクラスTable002)のテーブル固有のメソッドと定数を使用します。

    3. 2つの別々のdatabaseshelper(DBHelperTable001とDBHelperTable002)を使用し、コードを単純化するためにTable001クラスとTable002クラスを利用します。

      • onCreateを克服することに注意してください onOpenが1回だけ呼び出される メソッドは、それぞれのテーブルの作成も試みます(CREATE TABLE IF NOT EXISTS ...... この場合、テーブルが実際に存在するときに障害を回避することが重要です。
      • これは、複数のヘルパーを持つことの1つの非効率にすぎないことに注意してください。

    最初にテーブル固有のクラス(最初の順列では使用されません)

    Table001.java

    public class Table001 {
    
        public static final String TBL_TABLE001 = "table001";
        public static final String COL_TABLE001_ID = BaseColumns._ID;
        public static final String COL_TABLE001_MYDATA = "mydata";
    
        public static String getCrtSQL() {
            return "CREATE TABLE IF NOT EXISTS " + TBL_TABLE001 + "(" +
                    COL_TABLE001_ID + " INTEGER PRIMARY KEY, " +
                    COL_TABLE001_MYDATA + " TEXT" +
                    ")";
        }
    
        public static long insert(SQLiteDatabase db, String mydata) {
            ContentValues cv = new ContentValues();
            cv.put(COL_TABLE001_MYDATA,mydata);
            return db.insert(TBL_TABLE001,null,cv);
        }
    
        public static Cursor getAll(SQLiteDatabase db) {
            return db.query(TBL_TABLE001,null,null,null,null,null,null);
        }
    }
    

    Table002.java

    public class Table002 {
    
        public static final String TBL_TABLE002 = "table002";
        public static final String COL_TABLE002_ID = BaseColumns._ID;
        public static final String COL_TABLE002_MYOTHERDATA = "myotherdata";
    
        public static String getCrtSQL() {
            return "CREATE TABLE IF NOT EXISTS " + TBL_TABLE002 + "(" +
                    COL_TABLE002_ID + " INTEGER PRIMARY KEY, " +
                    COL_TABLE002_MYOTHERDATA + " TEXT" +
                    ")";
        }
    
        public static long insert(SQLiteDatabase db, String mydata) {
            ContentValues cv = new ContentValues();
            cv.put(COL_TABLE002_MYOTHERDATA,mydata);
            return db.insert(TBL_TABLE002,null,cv);
        }
    
        public static Cursor getAll(SQLiteDatabase db) {
            return db.query(TBL_TABLE002,null,null,null,null,null,null);
        }
    }
    

    4つのデータベースヘルパークラス

    DBHelper001.java-(自己完結型)

    public class DBHelper001 extends SQLiteOpenHelper {
    
        public static final String DBNAME = "mydb001";
        public static final int DBVERSION = 1;
    
        public static final String TBL_TABLE001 = "table001";
        public static final String TBL_TABLE002 = "table002";
        public static final String COL_TABLE001_ID = BaseColumns._ID;
        public static final String COL_TABLE001_MYDATA = "mydata";
        public static final String COL_TABLE002_ID = BaseColumns._ID;
        public static final String COL_TABLE002_MYOTHERDATA = "myotherdata";
    
        public DBHelper001(Context context) {
            super(context, DBNAME, null, DBVERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            String crt_table001_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE001 + "(" +
                    COL_TABLE001_ID + " INTEGER PRIMARY KEY," +
                    COL_TABLE001_MYDATA + " TEXT" +
                    ")";
            String crt_table002_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE002 + "(" +
                    COL_TABLE002_ID + " INTEGER PRIMARY KEY," +
                    COL_TABLE002_MYOTHERDATA + " TEXT" +
                    ")";
            db.execSQL(crt_table001_sql);
            db.execSQL(crt_table002_sql);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public long insertIntoTable001(String mydata) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(COL_TABLE001_MYDATA,mydata);
            return db.insert(TBL_TABLE001,null,cv);
        }
    
        public long insertIntoTable002(String myotherdata) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues cv = new ContentValues();
            cv.put(COL_TABLE002_MYOTHERDATA,myotherdata);
            return db.insert(TBL_TABLE002,null,cv);
        }
    
        public Cursor getAllFromTable001() {
            SQLiteDatabase db = this.getWritableDatabase();
            return db.query(TBL_TABLE001,null,null,null,null,null,null);
        }
    
        public Cursor getAllFromTable002() {
            SQLiteDatabase db = this.getWritableDatabase();
            return db.query(TBL_TABLE002,null,null,null,null,null,null);
        }
    }
    

    DBHelper002.java (他の場所のテーブル固有のコード)

    public class DBHelper002 extends SQLiteOpenHelper {
    
        public static final String DBNAME = "mydb002";
        public static final int DBVERSION = 1;
    
        public DBHelper002(Context context) {
            super(context, DBNAME, null, DBVERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(Table001.getCrtSQL());
            db.execSQL(Table002.getCrtSQL());
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    }
    

    DBHelperTable001.java(table001固有のヘルパー)

    public class DBHelperTable001 extends SQLiteOpenHelper {
    
        public static final String DBNAME = "mydb003";
        public static final int DBVERSION = 1;
    
        public DBHelperTable001(Context context) {
            super(context, DBNAME, null, DBVERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(Table001.getCrtSQL());
            //NOTE Table002 won't get created as onCreate is only called once
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        @Override
        public void onOpen(SQLiteDatabase db) {
            super.onOpen(db);
            db.execSQL(Table001.getCrtSQL());
        }
    }
    
    • onOpen メソッドは、データベースの存続期間中に1回だけ呼び出されるonCreateを回避するために使用されます。
      • execSQLの呼び出しは、この方法論の非効率性の例です。

    DBHelperTable002.java(table002固有のヘルパー)

    public class DBHelperTable002 extends SQLiteOpenHelper {
    
        public static final String DBNAME = "mydb003";
        public static final int DBVERSION = 1;
    
        public DBHelperTable002(Context context) {
            super(context, DBNAME, null, DBVERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(Table002.getCrtSQL());
            //NOTE Table001 won't get created as onCreate is only called once
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        @Override
        public void onOpen(SQLiteDatabase db) {
            super.onOpen(db);
            db.execSQL(Table002.getCrtSQL());
        }
    }
    

    それらをすべて結び付ける

    次のアクティビティは( MainActivity.java )を利用します )3つの順列すべてを利用します。各行が各テーブルに追加され、各テーブルのすべてのデータがカーソルに抽出されてからダンプされます(ログに出力されます)。

    テーブル固有のヘルパーの場合、各ヘルパーを使用して行を抽出することに注意してください(冗長性の側面を示しています)。

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        DBHelper001 mDBHlpr1;
        DBHelper002 mDBHlpr2;
        DBHelperTable001 mTblDBHlpr1;
        DBHelperTable002 mTblDBHlpr2;
        Cursor mCsr;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mDBHlpr1 = new DBHelper001(this);
            mDBHlpr1.insertIntoTable001("my data for table001 in mydb001");
            mDBHlpr1.insertIntoTable002("my other data for table002 in mydb001");
            mCsr = mDBHlpr1.getAllFromTable001();
            DatabaseUtils.dumpCursor(mCsr);
            mCsr = mDBHlpr1.getAllFromTable002();
            DatabaseUtils.dumpCursor(mCsr);
    
    
            mDBHlpr2 = new DBHelper002(this);
            Table001.insert(mDBHlpr2.getWritableDatabase(),"my data for table001 in mydb002");
            Table002.insert(mDBHlpr2.getWritableDatabase(),"my other data for table002 in mydb002");
            mCsr = Table001.getAll(mDBHlpr2.getWritableDatabase());
            DatabaseUtils.dumpCursor(mCsr);
            mCsr = Table002.getAll(mDBHlpr2.getWritableDatabase());
            DatabaseUtils.dumpCursor(mCsr);
    
            //Oooops???? wouldn't normally do this
            mCsr = Table001.getAll(mDBHlpr1.getWritableDatabase()); //?????????? from other database!!!
            DatabaseUtils.dumpCursor(mCsr);
    
            mTblDBHlpr1 = new DBHelperTable001(this);
            Table001.insert(mTblDBHlpr1.getWritableDatabase(),"my data for table001 in mydb003");
            mTblDBHlpr2 = new DBHelperTable002(this);
            Table002.insert(mTblDBHlpr2.getWritableDatabase(),"my data for table002 in mydb003");
            mCsr = Table001.getAll(mTblDBHlpr1.getWritableDatabase());
            DatabaseUtils.dumpCursor(mCsr);
            mCsr = Table002.getAll(mTblDBHlpr1.getWritableDatabase()); //???????????? but OK
            DatabaseUtils.dumpCursor(mCsr);
            mCsr = Table001.getAll(mTblDBHlpr2.getWritableDatabase());
            DatabaseUtils.dumpCursor(mCsr);
            mCsr = Table002.getAll(mTblDBHlpr2.getWritableDatabase()); //??????????? but OK
            DatabaseUtils.dumpCursor(mCsr);
        }
    }
    

    結果

    以下は最初の実行の結果です(アプリをアンインストールせずに複数回実行すると、2つの新しい行が追加されます):-

    03-06 11:27:18.453 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.453 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.453 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.453 11093-11093/? I/System.out:    mydata=my data for table001 in mydb001
    03-06 11:27:18.453 11093-11093/? I/System.out: }
    03-06 11:27:18.453 11093-11093/? I/System.out: <<<<<
    03-06 11:27:18.453 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.453 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.453 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.453 11093-11093/? I/System.out:    myotherdata=my other data for table002 in mydb001
    03-06 11:27:18.453 11093-11093/? I/System.out: }
    03-06 11:27:18.453 11093-11093/? I/System.out: <<<<<
    
    
    03-06 11:27:18.472 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.472 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.472 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.472 11093-11093/? I/System.out:    mydata=my data for table001 in mydb002
    03-06 11:27:18.472 11093-11093/? I/System.out: }
    03-06 11:27:18.472 11093-11093/? I/System.out: <<<<<
    03-06 11:27:18.472 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.473 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.473 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.473 11093-11093/? I/System.out:    myotherdata=my other data for table002 in mydb002
    03-06 11:27:18.473 11093-11093/? I/System.out: }
    03-06 11:27:18.473 11093-11093/? I/System.out: <<<<<
    
    
    03-06 11:27:18.473 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.473 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.473 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.473 11093-11093/? I/System.out:    mydata=my data for table001 in mydb001
    03-06 11:27:18.473 11093-11093/? I/System.out: }
    03-06 11:27:18.473 11093-11093/? I/System.out: <<<<<
    
    
    03-06 11:27:18.499 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.500 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.500 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.500 11093-11093/? I/System.out:    mydata=my data for table001 in mydb003
    03-06 11:27:18.500 11093-11093/? I/System.out: }
    03-06 11:27:18.500 11093-11093/? I/System.out: <<<<<
    03-06 11:27:18.500 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.500 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.501 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.501 11093-11093/? I/System.out:    myotherdata=my data for table002 in mydb003
    03-06 11:27:18.501 11093-11093/? I/System.out: }
    03-06 11:27:18.501 11093-11093/? I/System.out: <<<<<
    03-06 11:27:18.501 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.501 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.501 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.501 11093-11093/? I/System.out:    mydata=my data for table001 in mydb003
    03-06 11:27:18.501 11093-11093/? I/System.out: }
    03-06 11:27:18.502 11093-11093/? I/System.out: <<<<<
    03-06 11:27:18.502 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected]
    03-06 11:27:18.502 11093-11093/? I/System.out: 0 {
    03-06 11:27:18.502 11093-11093/? I/System.out:    _id=1
    03-06 11:27:18.502 11093-11093/? I/System.out:    myotherdata=my data for table002 in mydb003
    03-06 11:27:18.503 11093-11093/? I/System.out: }
    03-06 11:27:18.503 11093-11093/? I/System.out: <<<<<
    



    1. OracleのDECODEがNVLとは異なる値を与えるのはなぜですか?

    2. MySQL Galeraクラスターレプリケーションを使用した地理分散クラスターの作成:パート2

    3. Postgresタイムスタンプクエリ範囲を最適化する

    4. 画像をデータベースBLOBに保存します。 dbからPictureboxに取得