Android ORMLite是否可以通过删除和重新创建来自动升级数据库?
我们在当前的应用程序中实现了一个ORMLite解决方案。我们使用它缓存来自服务器的REST调用的结果。因此,数据是否存在(或者在用户更新应用程序时是否留下)并不是非常重要。我们刚刚添加了一个更新,它在一个数据库持久化模型中创建了一个新列,Android ORMLite是否可以通过删除和重新创建来自动升级数据库?,android,sqlite,upgrade,ormlite,Android,Sqlite,Upgrade,Ormlite,我们在当前的应用程序中实现了一个ORMLite解决方案。我们使用它缓存来自服务器的REST调用的结果。因此,数据是否存在(或者在用户更新应用程序时是否留下)并不是非常重要。我们刚刚添加了一个更新,它在一个数据库持久化模型中创建了一个新列,Shift,现在我们看到以下异常: Caused by: android.database.sqlite.SQLiteException: no such column: acknowledged (code 1): , while compiling: SEL
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)
原因:android.database.sqlite.SQLiteException:无此类列:已确认(代码1):,编译时:选择*自。。。
在android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)中
位于android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113)
位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690)
位于android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
位于android.database.sqlite.SQLiteQuery(SQLiteQuery.java:37)
位于android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
位于android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1430)
位于android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1369)
在com.j256.ormlite.android.AndroidCompiledStatement.getCursor上(AndroidCompiledStatement.java:162)
在com.j256.ormlite.android.AndroidCompiledStatement.runQuery上(AndroidCompiledStatement.java:57)
位于com.j256.ormlite.stmt.SelectIterator。(SelectIterator.java:55)
位于com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:232)
位于com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:181)
位于com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:263)
我检查以确保该字段已添加到ORMLite配置文件中,并且确实如此,因此我不确定这里发生了什么。我原以为ORMLite会删除数据库并在发现模式已更改时重新创建它(并且您没有向DatabaseHelper
添加onUpgrade()
方法),但我现在认为我错了
我该如何解决这个问题?我试着阅读ORMLite手册,但要么我忽略了关于默认升级行为的部分,要么我没有找到它…ORMLite只是Android SQLite的包装,因此您可以在升级SQLite数据库的同时升级数据库 这可以通过三个简单的步骤来完成
你完了 当不需要将数据从旧版本传输到新版本时,我将此代码用于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);
}
}
我原以为ORMLite会删除数据库并在发现模式已更改时重新创建它(并且您没有向DatabaseHelper添加onUpgrade()方法),但现在我认为我错了
你错了。ORMLite没有任何处理模式更新的魔法代码。查看手册中的文档。引述:
升级应用程序时,可能需要添加列或对应用程序以前版本存储的数据进行其他更改。如果您在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;");
Dao-Dao=getHelper().getAccountDao();
//更改表以添加名为“age”的新列
executeRaw(“ALTER TABLE`account`ADD COLUMN age INTEGER;”);
因此,您需要自己进行升级。这些文档还显示了如何使用数据库版本号根据客户机的数据库版本进行特定更改
如果您不关心现有的表,那么onUpgrade(…)
方法可以直接删除表并调用onCreate(…)
状态,您必须同时实现onCreate
和onUpgrade
显然我们确实实现了onUpgrade
,但我想我得到的是:“我可以把整个数据库放到onUpgrade()
中,让它自己重新创建吗?”