我需要创建一个Android App数据库,但是我想知道是否应该为我的数据库中每个表的sqliteopenhelper创建一个类,而我的数据库中存在?或者我应该创建一个类:例如从sqliteopenhelper继承并在ongreate方法中创建所有表以及更新和删除函数的myAppDatabase?
有什么建议?
您只需要一个数据库助手来对数据库中的所有表进行一个数据库助手,因此您只需使用一个 oncreate 方法来创建表。请注意,如果您有多个数据库助手, ongreate (和 onupdate 方法)只会由打开数据库的第一个助手来调用一次助手效率低下,拥有多个数据库帮助者可能会更加复杂。
更具体地说, ongreate 仅在数据库不存在时自动调用。到时间 oncreate 被称为数据库本身。
onupdate 仅在打开数据库时才能调用,将版本号传递给呼叫(通过超级呼叫)大于数据库文件中存储的版本号。此时,该版本编号存储在文件中,然后更新以反映较新的版本。因此,随后的呼叫不会然后调用 onupgrade 方法。
您是否可以选择分配方法和标识符,例如单个表的列/表名称。有些人可能认为将他人拆分很尴尬。
示例
以下代码是所有利用2个表的3个排列(以及数据库)的示例>)和 table001 (列名称 _id 和 myotherdata )。
-
使用单个数据库Helper(DBHELPER001),所有内容都嵌入了辅助器内。数据库是 myDB001
-
在特定表方向的类(类Table001和Class Table002)中,使用单个数据库Helper(DBHELPER002)。
-
使用两个单独的数据库估算器(dbhelpertable001和dbhelpertable002),并为代码的简单性使用table001和table002类。
- 请注意,要克服 ongreate 仅在 onopen 方法中被称为方法还尝试创建相应的表(在这种情况下,
CREATE TABLE IF NOT EXISTS ......
在这种情况下很重要,以避免出现表格。实际上确实存在)。 - 请注意,这只是拥有多个帮助者的效率低下。
- 请注意,要克服 ongreate 仅在 onopen 方法中被称为方法还尝试创建相应的表(在这种情况下,
首先是表特定类(第一个排列未使用)
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);
}
}
四个数据库助手类
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());
}
}
- NOTE onopen 方法可用于规避数据库一生中一次调用一次。
- 调用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 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: <<<<<