是有一个大的SQLiteOpenHelper
子类来为数据库中的每个表定义onCreate
和onUpgrade
方法更好,还是有很多SQLiteOpenHelper
子类更好,每个表一个?
有最佳实践吗?或者两者都可以接受,但有不同的好坏副作用?
是有一个大的SQLiteOpenHelper
子类来为数据库中的每个表定义onCreate
和onUpgrade
方法更好,还是有很多SQLiteOpenHelper
子类更好,每个表一个?
有最佳实践吗?或者两者都可以接受,但有不同的好坏副作用?
您应该为所有表提供一个 SQLiteOpenHelper 类。检查此链接。
只是为了采用不同的方法:
您始终可以覆盖该onOpen(..)
方法,将其称为您的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,这就是我所做的:将“表创建”sql 列表传递给 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 有帮助,当且仅当存在具有相同名称和相同 DATABASE_VERSION 的数据库时,android 似乎不会执行 onCreate 函数