Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ORMLite是否可以通过删除和重新创建来自动升级数据库?_Android_Sqlite_Upgrade_Ormlite - Fatal编程技术网

Android ORMLite是否可以通过删除和重新创建来自动升级数据库?

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

我们在当前的应用程序中实现了一个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)
原因: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数据库的同时升级数据库

这可以通过三个简单的步骤来完成

  • 只需在assest中添加sql脚本文件或将其作为资源,然后命名它们,这有助于为您在数据库中所做的更改选择适当的db版本

  • 确定任何版本更改并选择适当的脚本文件

  • 逐行读取脚本文件并在db上执行sql脚本


  • 你完了

    当不需要将数据从旧版本传输到新版本时,我将此代码用于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()
    中,让它自己重新创建吗?”