更新:Bref:Kuffs的答案简单而正确。 MikeT的答案是一种有趣的方法。
旧版本: 我正在开发一个Android应用程序。 我需要知道是否有新的sql版本。如果我的数据库是最新的,我将触发异步操作。 但是如何触发异步操作呢?
目前,我在onNewVersion
设置了true
我自己的旗帜onUpgrade()
。然后我在onOpen()
进行检查。还有其他方法吗?
@override
onUpgrade(...) {
onNewVersion = true;
...
}
@override
onOpen(...) {
if (onNewVersion == FALSE)
triggerAction();
}
感谢。
答案 0 :(得分:1)
需要升级数据库时调用。实施 应该使用此方法删除表,添加表或执行任何其他操作 它需要升级到新的架构版本。
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 5) {
db.execSQL("ALTER_TABLE_STATEMENT");
}
if (oldVersion < 6) {
db.execSQL("ALTER_TABLE_STATEMENT2");
}
}
答案 1 :(得分:1)
您可以在onUpgrade
的{{1}}方法中设置一个标记。
如果在您获得对OpenHelper的引用时未设置该标志,则数据库已经是最新的,不需要更新。
答案 2 :(得分:0)
还有其他方法吗?
是的,我个人使用一种伪/想要/期望的架构,简而言之,将其与实际存在的列,表,索引(根据需要)创建(表索引)/添加(列)进行比较。
因此我不使用版本,onUpgrade
为空。
例如,这些是我的SQLiteOpenhelper子类中的核心方法: -
@Override
public void onCreate(SQLiteDatabase db) {
usable = this.onExpand(db,false);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
}
public boolean onExpand(SQLiteDatabase db, boolean buildandexpand) {
boolean rv = true;
if (db == null) {
db = instance.getWritableDatabase();
}
// Is the Database definition valid to use?
if (DBConstants.cardonsier.isDBDatabaseUsable()) {
ArrayList<String> buildsql = DBConstants.cardonsier.generateDBBuildSQL(db);
// Anything to build
if (!buildsql.isEmpty()) {
// YES so build the Database
DBConstants.cardonsier.actionDBBuildSQL(db);
}
if (buildandexpand) {
ArrayList<String> altersql = DBConstants.cardonsier.generateDBAlterSQL(db);
if (!altersql.isEmpty()) {
DBConstants.cardonsier.actionDBAlterSQL(db);
}
}
}
else {
rv = false;
}
return rv;
}
DBConstants.cardoniser是指DBDatabase对象,定义为: -
static final DBDatabase cardonsier = new DBDatabase(DATABASENAME,
new ArrayList<>(Arrays.asList(
DBCardsTableConstants.CARDS,
DBUsertableConstants.USERS,
DBCardUserLinkTableConstants.CARDUSERLINKS,
DBPreftableConstants.PREFS,
DBPayeestableContants.PAYEES,
DBCategoriestableConstants.CATEGORIES,
DBCardCategoryLinkTableConstants.CARDCATEGORYLINKS,
DBCardPayeeLinkTableConstants.CARDPAYEELINKS,
DBTransactionsTableConstants.TRANSACTIONS,
DBCardTypesTableConstants.CARDTYPES
))
);
即。 DBTable对象列表,包括DBColumn对象,例如: -
static final DBTable CARDS = new DBTable(CARDS_TABLE,
new ArrayList<>(Arrays.asList(
CARDID,
CARDOWNER,
CARDNAME,
CARDTYPEREF,
CARDNUMBER,
CARDCVVCODE,
CARDPIN,
CARDNOTES,
CARDEXPIRYDATE,
CARDNAMEONCARD
))
);
列的定义如下: -
static final DBColumn CARDID = new DBColumn(true);
static final DBColumn CARDOWNER = new DBColumn(
CARDOWNER_COL,
SQLINTEGER,
false,
"0"
);
static final DBColumn CARDNAME = new DBColumn(
CARDNAME_COL,
SQLTEXT,
false,
""
);
static final DBColumn CARDTYPEREF = new DBColumn(
CARDTYPEREF_COL,
SQLINTEGER,
false,
"0"
);
请注意!第一列CARDID,使用标准_id列的快捷构造函数。
要添加新列,只需定义DBColumn并在DBTable定义中包含DBColumn即可。 onExpand
方法将在新列的情况下通过DBDatabase的actionDBAlterSQL
方法添加列。新表需要以上内容以及在DBDatabase定义中包含该表,并由onExpand
通过actionDBBuildSQL
方法应用。
onExpand
。但是,传递true
以便调用actionDBAlterSQL
方法。
作为示例添加: -
private static final String CARDCOLOUR_COL = "cardcolour";
..........
static final DBColumn CARDCOLOUR = new DBColumn(
CARDCOLOUR_COL,
SQLINTEGER,
false,
Long.toString(0x00_00_00_00_00L)
// Flag, alpha, red, green, blue
// Flag used to inidcate if colour has been set
);
然后根据以下内容将CARDCOLOUR
添加到DBTable
定义中: -
static final DBTable CARDS = new DBTable(CARDS_TABLE,
new ArrayList<>(Arrays.asList(
CARDID,
CARDOWNER,
CARDNAME,
CARDTYPEREF,
CARDNUMBER,
CARDCVVCODE,
CARDPIN,
CARDNOTES,
CARDEXPIRYDATE,
CARDNAMEONCARD,
CARDCOLOUR //<<<<<<<<<<
))
);
结果(开发时记录日志记录): -
09-22 08:30:26.802 2713-2713/? D/DBEXPAND: Expanding Database Schema Usability=true
09-22 08:30:26.803 2713-2713/? D/DBEXPAND: Build SQL is as follows:-
09-22 08:30:26.803 2713-2713/? D/DBEXPAND: ALTERSQL is as folows:-
09-22 08:30:26.807 2713-2713/? D/DBEXPAND: ALterSQL Line= ALTER TABLE cards ADD COLUMN cardcolour INTEGER DEFAULT 0 ;
结果已填充的表格如下: -
使用ALTER TABLE
DEFAULT
值( DBColumn 的第4个参数(第1个是列名,第2个类型,第3个为true以包含在主索引中)< / em>)填充现有行的新列。