数据库中的每个表是否应该有一个SQLiteOpenHelper?

最好有一个大的SQLiteOpenHelper子类,它为数据库中的每个表定义onCreateonUpgrade方法,或者最好是有许多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,下面是我做的:将“表创build”sqls列表传递给SQLiteOpenHelper子类的构造函数,然后在onCreate函数中迭代列表以创build每个表。 所以我的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); } } 

但是,这又带来另一个问题:在添加一个新表之后,安装新版本的应用程序与现有的旧版本的应用程序,新表将不会被创build,因为旧数据库的存在将阻止onCreate函数调用。 所以用户必须先卸载应用程序,然后完全安装应用程序。 DATABASE_VERSION的帮助,似乎android 不会执行onCreate函数当且仅当存在数据库具有相同的名称和相同的DATABASE_VERSION