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

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

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

因此,对于同一数据库(* .db文件),我将获得多个不同的版本值。如果它们都是相同的val,则不会调用onUpgrade()方法,因此不会调用onCreate()方法,因此不会创建新表。

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

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

更新

因此,这是我的非破坏性方式(通过在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()。

最佳答案

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


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


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


那根本不是“好”。人数最多者获胜。


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


将“将db代码分成几个类,每个表一个”不一定是问题。问题在于让它们成为SQLiteOpenHelper的独立子类。

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

10-07 12:50