我应该为数据库中的每个 table 创建一个继承 SQLiteOpenHelper 的 class 吗?
Should I create a class that inherits SQLiteOpenHelper for each table in my database?
我需要创建一个 android 应用程序数据库,但我想知道我是否应该创建一个 class 来为我的数据库中存在的每个 table 继承 SQLiteOpenHelper?或者我应该创建一个 class :例如继承自 SQLiteOpenHelper 的 MyAppDatabase 并在 onCreate 方法中创建我所有的 tables 以及更新和删除功能?
有什么建议吗?
对于数据库中的所有 table,您只需要一个数据库助手,因此您将使用一个 onCreate 方法来创建 table秒。请注意,如果您有多个数据库助手,则 onCreate(和 onUpdate 方法)只会被打开数据库的第一个助手调用一次,并且因此,除了让多个助手效率低下之外,拥有多个数据库助手可能会更加复杂。
更具体地说,onCreate 仅在数据库不存在时自动调用。当调用 onCreate 时,数据库本身已经创建。
onUpdate 仅在打开数据库时调用(通过超级调用)传递给调用的版本号大于数据库文件中存储的版本号。此时存储在文件中的版本号将更新以反映较新的版本。因此后续调用将不会调用 onUpgrade 方法。
您可以选择是否拆分方法和标识符,例如 column/table 个人 table 的名称。有些人可能认为拆分很别扭,其他人可能认为这样更清楚。
例子
以下代码是 3 个排列(以及数据库)的示例,它们都使用 2 个 table,即 table001(列 _id and mydata) and table001 (column names _id 和 myotherdata).
使用单个数据库助手 (DBHelper001),所有内容都嵌入在助手中。数据库是mydb001
使用单个数据库助手 (DBHelper002) 以及 Table 特定方法和特定 table 导向的常量 classes (class Table001 和 class Table002).
使用两个独立的数据库助手(DBHelperTable001 和 DBHelperTable002),为了简化代码使用 Table001 和 Table 002classes.
- 请注意,为了克服 onCreate 仅被调用一次的问题,onOpen 方法还尝试创建相应的 table (
CREATE TABLE IF NOT EXISTS ......
在这种情况下很重要,可以在 table 实际上存在时避免失败。
- 请注意,这只是拥有多个助手的低效率之一。
首先是 table 特定的 classes(第一个排列未使用)
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);
}
}
四个数据库助手classes
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(table具体代码别处)
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 方法用于避免 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());
}
}
将它们捆绑在一起
下面的activity利用了(MainActivity.java)利用了所有3个排列。对于每个行添加到每个 table,然后每个 table 中的所有数据都被提取到一个游标中,然后将其转储(输出到日志)。
请注意,对于 table 个特定的助手,每个助手都用于提取行(显示冗余方面)。
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 android.database.sqlite.SQLiteCursor@12c4306e
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 android.database.sqlite.SQLiteCursor@275e530f
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 android.database.sqlite.SQLiteCursor@1006e57a
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 android.database.sqlite.SQLiteCursor@2337112b
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 android.database.sqlite.SQLiteCursor@37ef9988
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 android.database.sqlite.SQLiteCursor@2b786c5d
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 android.database.sqlite.SQLiteCursor@2038a9d2
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 android.database.sqlite.SQLiteCursor@264a7aa3
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 android.database.sqlite.SQLiteCursor@3c2611a0
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: <<<<<
我需要创建一个 android 应用程序数据库,但我想知道我是否应该创建一个 class 来为我的数据库中存在的每个 table 继承 SQLiteOpenHelper?或者我应该创建一个 class :例如继承自 SQLiteOpenHelper 的 MyAppDatabase 并在 onCreate 方法中创建我所有的 tables 以及更新和删除功能?
有什么建议吗?
对于数据库中的所有 table,您只需要一个数据库助手,因此您将使用一个 onCreate 方法来创建 table秒。请注意,如果您有多个数据库助手,则 onCreate(和 onUpdate 方法)只会被打开数据库的第一个助手调用一次,并且因此,除了让多个助手效率低下之外,拥有多个数据库助手可能会更加复杂。
更具体地说,onCreate 仅在数据库不存在时自动调用。当调用 onCreate 时,数据库本身已经创建。
onUpdate 仅在打开数据库时调用(通过超级调用)传递给调用的版本号大于数据库文件中存储的版本号。此时存储在文件中的版本号将更新以反映较新的版本。因此后续调用将不会调用 onUpgrade 方法。
您可以选择是否拆分方法和标识符,例如 column/table 个人 table 的名称。有些人可能认为拆分很别扭,其他人可能认为这样更清楚。
例子
以下代码是 3 个排列(以及数据库)的示例,它们都使用 2 个 table,即 table001(列 _id and mydata) and table001 (column names _id 和 myotherdata).
使用单个数据库助手 (DBHelper001),所有内容都嵌入在助手中。数据库是mydb001
使用单个数据库助手 (DBHelper002) 以及 Table 特定方法和特定 table 导向的常量 classes (class Table001 和 class Table002).
使用两个独立的数据库助手(DBHelperTable001 和 DBHelperTable002),为了简化代码使用 Table001 和 Table 002classes.
- 请注意,为了克服 onCreate 仅被调用一次的问题,onOpen 方法还尝试创建相应的 table (
CREATE TABLE IF NOT EXISTS ......
在这种情况下很重要,可以在 table 实际上存在时避免失败。 - 请注意,这只是拥有多个助手的低效率之一。
- 请注意,为了克服 onCreate 仅被调用一次的问题,onOpen 方法还尝试创建相应的 table (
首先是 table 特定的 classes(第一个排列未使用)
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);
}
}
四个数据库助手classes
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(table具体代码别处)
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 方法用于避免 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());
}
}
将它们捆绑在一起
下面的activity利用了(MainActivity.java)利用了所有3个排列。对于每个行添加到每个 table,然后每个 table 中的所有数据都被提取到一个游标中,然后将其转储(输出到日志)。
请注意,对于 table 个特定的助手,每个助手都用于提取行(显示冗余方面)。
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 android.database.sqlite.SQLiteCursor@12c4306e 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 android.database.sqlite.SQLiteCursor@275e530f 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 android.database.sqlite.SQLiteCursor@1006e57a 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 android.database.sqlite.SQLiteCursor@2337112b 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 android.database.sqlite.SQLiteCursor@37ef9988 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 android.database.sqlite.SQLiteCursor@2b786c5d 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 android.database.sqlite.SQLiteCursor@2038a9d2 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 android.database.sqlite.SQLiteCursor@264a7aa3 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 android.database.sqlite.SQLiteCursor@3c2611a0 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: <<<<<