1

我将每个 SQLite 表的代码(包括表的初始构造以及对该表的操作)分解为扩展 SQLiteOpenHelper 的单独类。

为了创建这些表(也就是说,要调用 onCreate() 方法),我必须增加 DATABASE_VERSION (有关详细信息,请参见我自己的答案)。

但是使用这种方法,我最终会为每个类/表设置不同的版本号——我必须将我创建的第二个表的 DATABASE_VERSION 值设置为 2,我必须将第三个表设置为 3,等等。

所以我最终会为同一个数据库(*.db 文件)提供多个不同的版本值。如果它们都是相同的 val,则不会调用 onUpgrade() 方法,因此不会调用 onCreate() 方法,因此不会创建新表。

这是“好的” - 拥有一个具有多个不同同时版本号的数据库吗?

我知道的唯一其他(合理)选项是将所有数据库代码(涵盖多个表)放入扩展 SQLiteOpenHelper 的单个类中 - 这样做实际上是首选方法吗?IOW,我将数据库代码分成几个类,每个表一个类,是帮助还是障碍?

更新

所以这是我的非破坏性方式(通过在 DDL 中插入“IF NOT EXISTS”)逐步添加新表,根据 CommonsWare 的建议,只使用一个扩展 SQLiteOpenHelper 的类:

@Override
public void onCreate(SQLiteDatabase db) {
    String CONDITIONALLY_CREATE_VENDORS_TABLE = "CREATE TABLE IF NOT EXISTS " +
            TABLE_VENDORS + "("
            + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_VENDORID
            + " TEXT," + COLUMN_COMPANYNAME + " TEXT" + ")";
    db.execSQL(CONDITIONALLY_CREATE_VENDORS_TABLE);
    // add more tables as needed following the pattern above
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //db.execSQL("DROP TABLE IF EXISTS " + TABLE_VENDORS); <= Only need to DROP if the table's structure changes; so comment such a line out for the particular table in that case
    onCreate(db);
}

注意:每当我添加一个新表时,我必须“增加”(增加)DATABASE_VERSION 值,以便调用 onUpgrade()/onCreate()。

4

1 回答 1

3

我将每个 SQLite 表的代码(包括表的初始构造以及对该表的操作)分解为扩展 SQLiteOpenHelper 的单独类

重要的是,出于线程安全以及其他原因,拥有一个SQLiteDatabase一致使用的实例。反过来,这将要求您有一个SQLiteOpenHelper班级。完全独立的数据库文件(SQLiteHelper每个数据库一个)例外,但通常不需要。

这是“好的” - 拥有一个具有多个不同同时版本号的数据库吗?

这根本不是“好的”。最高数获胜。

我知道的唯一其他(合理)选项是将所有数据库代码(涵盖多个表)放入扩展 SQLiteOpenHelper 的单个类中 - 这样做实际上是首选方法吗?IOW,我将数据库代码分成几个类,每个表一个类,是帮助还是障碍?

将“数据库代码分成几个类,每个表一个”不一定是问题。问题是让它们成为SQLiteOpenHelper.

假设您希望这些类不仅可以处理表的创建和升级,还可以处理与表相关的其他 CRUD 操作。有一个专门的课程很好。但是,表创建和升级逻辑需要由单个SQLiteOpenHelper类驱动。只需将实际onCreate()工作委托给每个表类即可。通过这种方式,您可以获得代码组织,而无需多个类。onUpgrade()SQLiteOpenHelperSQLiteOpenHelper

于 2014-04-15T17:25:29.217 回答