我们在当前的应用程序中实现了ORMLite解决方案。我们使用它来缓存来自我们服务器的REST调用的结果。因此,数据存在并不是非常重要(或者当用户更新应用程序时遗留下来)。我们刚刚添加了一个更新,它在我们的一个数据库持久模型Shift
中创建了一个新列,我们现在看到以下异常:
Caused by: android.database.sqlite.SQLiteException: no such column: acknowledged (code 1): , while compiling: SELECT * FROM ...
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1430)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1369)
at com.j256.ormlite.android.AndroidCompiledStatement.getCursor(AndroidCompiledStatement.java:162)
at com.j256.ormlite.android.AndroidCompiledStatement.runQuery(AndroidCompiledStatement.java:57)
at com.j256.ormlite.stmt.SelectIterator.<init>(SelectIterator.java:55)
at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:232)
at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:181)
at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:263)
我检查确保将此字段添加到ORMLite配置文件中,它确实是,所以我不确定这里发生了什么。我认为ORMLite会删除数据库并重新创建它,如果它发现架构已经更改(并且你没有向onUpgrade()
添加DatabaseHelper
方法),但我现在正在考虑我错了。
我该如何解决这个问题?我已经尝试过阅读ORMLite手册了,但要么我在关于默认升级行为的部分上进行了掩饰,要么我没有找到它......
答案 0 :(得分:3)
我认为ORMLite会删除数据库并重新创建它,如果它发现架构已经更改(并且你没有将onUpgrade()方法添加到DatabaseHelper),但我现在认为我是不正确。
你错了。 ORMLite没有任何处理架构更新的魔术代码。查看手册中upgrading your schema的文档。引用:
升级应用程序时,可能必须添加列或对以前版本的应用程序存储的数据进行其他更改。如果你在Android上然后在DatabaseHelper中,应该有一个onUpgrade()方法,它从OrmLiteSqliteOpenHelper扩展以下方法。
abstract void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion)
在该方法中,您可以使用DAO对架构执行任何调整:
Dao<Account, Integer> dao = getHelper().getAccountDao(); // change the table to add a new column named "age" dao.executeRaw("ALTER TABLE `account` ADD COLUMN age INTEGER;");
所以你需要自己进行升级。文档还说明了如何使用数据库版本号根据客户端具有的数据库版本进行特定更改。
如果您不关心现有表格,那么onUpgrade(...)
方法可以删除表格并致电onCreate(...)
。
答案 1 :(得分:0)
ORMLite只是Android SQLite的包装器,因此您可以像升级SQLite数据库一样升级数据库。
可以通过三个简单步骤完成
只需在assest中添加sql脚本文件或将其作为资源,然后命名它们,这有助于为您在数据库中所做的更改选择合适的db版本
确定任何版本更改并选择适当的脚本文件
逐行读取脚本文件并在db
你完成了!
答案 2 :(得分:0)
我将此代码用于onUpgrade,以便在不需要将数据从旧版本传输到新版本时使用。我想我会帮助你
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource, YourRecord.class, true);
// Drop other tables here
onCreate(database, connectionSource);
} catch (SQLException e) {
Log.e(TAG, e.getMessage(), e);
}
}