データベース内のすべてのテーブルに必要なデータベースヘルパーは1つだけなので、 onCreateを1つ使用します。 テーブルの作成方法。複数のデータベースヘルパーがある場合は、 onCreate (および onUpdate メソッド)は、データベースを開いた最初のヘルパーによって1回だけ呼び出されるため、複数のヘルパーが非効率的であることに加えて、複数のデータベースヘルパーを使用する方が複雑になる可能性があります。
より具体的には、 onCreate データベースが存在しない場合にのみ自動的に呼び出されます。 onCreateまでに データベース自体が作成されたと呼ばれます。
onUpdate データベースを開いたときに(スーパーコールを介して)呼び出しに渡されたバージョン番号が、データベースファイルに格納されているバージョン番号よりも大きい場合にのみ呼び出されます。この時点でファイルに保存されているバージョン番号は、新しいバージョンを反映するように更新されます。したがって、後続の呼び出しは onUpgradeを呼び出しません。 メソッド。
個々のテーブルの列/テーブル名など、メソッドと識別子を分割するかどうかは、選択できます。分割するのは厄介だと考える人もいれば、より明確だと思う人もいます。
例
次のコードは、すべて2つのテーブル、つまり table001 を利用する3つの順列(およびデータベース)の例です。 (列 _id およびmydata )および table001 (列名 _id およびmyotherdata 。
-
ヘルパー内にすべてが埋め込まれた単一のdatabaseHelper(DBHelper001)を使用します。データベースはmydb001
-
単一のデータベースヘルパー(DBHelper002)を使用し、特定のテーブル指向クラス(クラスTable001およびクラスTable002)のテーブル固有のメソッドと定数を使用します。
-
2つの別々のdatabaseshelper(DBHelperTable001とDBHelperTable002)を使用し、コードを単純化するためにTable001クラスとTable002クラスを利用します。
- onCreateを克服することに注意してください onOpenが1回だけ呼び出される メソッドは、それぞれのテーブルの作成も試みます(
CREATE TABLE IF NOT EXISTS ......
この場合、テーブルが実際に存在するときに障害を回避することが重要です。 - これは、複数のヘルパーを持つことの1つの非効率にすぎないことに注意してください。
- onCreateを克服することに注意してください onOpenが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: <<<<<