20

是有一个大的SQLiteOpenHelper子类来为数据库中的每个表定义onCreateonUpgrade方法更好,还是有很多SQLiteOpenHelper子类更好,每个表一个?

有最佳实践吗?或者两者都可以接受,但有不同的好坏副作用?

4

3 回答 3

25

您应该为所有表提供一个 SQLiteOpenHelper 类。检查链接。

于 2012-12-14T11:25:11.957 回答
5

只是为了采用不同的方法:

您始终可以覆盖该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 扩展的每个类执行此操作

于 2014-03-23T20:34:11.960 回答
2

@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 函数

于 2014-05-02T15:23:20.383 回答