有一个大的SQLiteOpenHelper
子类可以为数据库中的每个表定义onCreate
和onUpgrade
方法,还是最好有许多SQLiteOpenHelper
子类,每个表有一个更好?数据库中的每个表是否应该有一个SQLiteOpenHelper?
是否有最佳做法?或者都可以接受,但有不同的好的和坏的副作用?
有一个大的SQLiteOpenHelper
子类可以为数据库中的每个表定义onCreate
和onUpgrade
方法,还是最好有许多SQLiteOpenHelper
子类,每个表有一个更好?数据库中的每个表是否应该有一个SQLiteOpenHelper?
是否有最佳做法?或者都可以接受,但有不同的好的和坏的副作用?
对于所有表,您应该有一个SQLiteOpenHelper类。检查this链接。
只是一种不同的方法的缘故:
您可以随时在onOpen(..)
方法overried有叫你onCreate(..)
。一定要使用"CREATE TABLE IF NOT EXISTS..."
语句,而不是"CREATE TABLE"
@Override
public void onOpen(SQLiteDatabase db) {
onCreate(db);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_FRIENDS_TABLE = "CREATE TABLE IF NOT EXISTS ...";
db.execSQL(CREATE_FRIENDS_TABLE);
}
你做的每从SQLiteOpenHelper
扩展类@TheReader是正确的。我更喜欢所有表的单个SQLiteOpenHelper,下面是我所做的:将“表创建”sqls的列表传递给SQLiteOpenHelper子类的构造函数,然后在onCreate函数中迭代列表以创建每个表。 所以我SQLiteOpenHelper的子类看起来某事像这样:
public ModelReaderDbHelper(Context context, List<String> createSQLs, List<String> deleteSQLs){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.TABLE_CREATION_SQLS = createSQLs;
this.TABLE_DELETE_SQLS = deleteSQLs;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
for(String oneCreation : TABLE_CREATION_SQLS){
sqLiteDatabase.execSQL(oneCreation);
}
}
惟独另一个问题:添加新表后,并与现有的旧安装安装应用程序的新版本,新表将不会被创建,因为旧数据库的存在将阻止onCreate函数被调用。所以用户必须先卸载应用程序,然后完全安装应用程序。该DATABASE_VERSION帮助,它似乎安卓不会执行的onCreate功能当且仅当的一个existin数据库具有相同的名称和相同的DATABASE_VERSION
好的,谢谢,你知道有一个为每个sideeffect表?或者只有一个文件才能编辑? –
查看编辑答案 –
谢谢,这是很有说服力的,我会尽快阅读! :D:D –