【发布时间】:2014-04-15 16:36:04
【问题描述】:
我将每个 SQLite 表的代码(包括表的初始构造以及对该表的操作)分解为扩展 SQLiteOpenHelper 的单独类。
为了创建这些表(也就是说,要调用 onCreate() 方法),我必须增加 DATABASE_VERSION(详见my own answer here)。
但是使用这种方法,我最终会为每个类/表设置不同的版本号——我必须将我创建的第二个表的 DATABASE_VERSION 值设置为 2,我必须将第三个表设置为 3,等等。
所以我最终会为同一个 DATABASE(*.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()调用。
【问题讨论】:
-
如果我理解正确,您打算将现有表拆分为两个或多个新建表。这可以在不修改数据库版本的情况下完成。如果您更改数据库版本,则将调用 onUpgrade 方法。这将清除您在任何表中拥有的所有现有数据,这根本不需要。此外,如果您想更改某些 EXISTING 表的表结构,onUpgrade 和 DB 版本可能会有所帮助,但在您的情况下,您只是希望将一个表分成两个或多个新表。
-
不,我不是在说将一个表重构为 N 个表;我只是在谈论将新表添加到现有数据库中(一次添加一个表到代码中)。
标签: android sqlite oncreate sqliteopenhelper database-versioning