【问题标题】:Room cannot verify the data integrity in AndroidRoom 无法在 Android 中验证数据完整性
【发布时间】:2017-11-16 12:53:29
【问题描述】:

MainActivity 类

public class MainActivity extends BaseActivity {

    private AppDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Database creation
        db = Room.databaseBuilder(getApplicationContext(),
                AppDatabase.class, "Medimap-db").build();
//        Profile profile=new Profile("rajitha","12-2-345","male","no 345","test med","test emergency","testurl");
//        db.profileDao().insert(profile);
//        Toast.makeText(getApplicationContext(),"success",Toast.LENGTH_SHORT).show();
        new DatabaseAsync().execute();


    }

    private class DatabaseAsync extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            //Perform pre-adding operation here.
        }

        @Override
        protected Void doInBackground(Void... voids) {
            //Let's add some dummy data to the database.
            Profile profile = new Profile("rajitha", "12-2-345", "male", "no 345", "test med", "test emergency", "testurl");
            db.profileDao().insert(profile);


            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_SHORT).show();
            //To after addition operation here.
        }
    }

}

AppDatabase 类

   @Database(entities = {Profile.class, Medicine.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract ProfileDao profileDao();
        public abstract MedicineDao medicineDaoDao();
    }

个人资料

@Dao
public interface ProfileDao {

    @Query("SELECT * FROM profile")
    List<Profile> getAll();

//    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
//    List<Profile> loadAllByIds(int[] userIds);

//    @Query("SELECT * FROM user WHERE first_name LIKE :first AND "
//            + "last_name LIKE :last LIMIT 1")
//    User findByName(String first, String last);

    @Insert
    void insertAll(Profile... profiles);

    @Insert
    void insert(Profile profile);

    @Delete
    void delete(Profile profile);
}

第一次运行应用程序后出现错误。看起来该应用程序正在尝试再次创建 DATABASE,但已经有一个现有的,因此他们建议更改版本代码。我的要求是我只需要插入一个新的数据集。我怎样才能做到这一点?提前致谢。这是 logcat 错误:

Caused by: java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.

【问题讨论】:

  • 如果您正在更改数据库架构(即实体或其他内容),那么您必须在此行中增加版本@Database(entities = {Profile.class, Medicine.class}, version = 1)
  • 看我需要向配置文件表输入数据。所以我不打算更改表的架构。
  • 看我需要向配置文件表输入数据。所以我不打算更改表的架构。
  • 这个问题几乎是 stackoverflow.com/questions/44197309/… 的重复检查该问题的第一个答案,您将获得一个更完整的答案,可以处理多种情况(例如发生此错误并且您已经拥有应用程序时)生产中)。

标签: android sqlite android-room


【解决方案1】:

Android 6.0+

对于那些现在遇到这种情况的人来说,简单地卸载可能无济于事,而且会让你发疯,所以在你必须弄清楚之前,让我分享一下这个问题:谷歌引入了“自动备份”功能 Android 6.0,在您重新安装时带回一个数据库。 (https://developer.android.com/guide/topics/data/autobackup.html)

您可以简单地添加...

<application ...
    android:allowBackup="false">
</app>

...禁用此功能,一切顺利(现在您只需卸载即可删除数据库)。

【讨论】:

  • 有什么办法可以保持android:allowBackup=false 不崩溃?
  • 这对我来说从来没有崩溃过,你的崩溃报告怎么说?
【解决方案2】:

如果您目前只是在开发应用程序,则意味着您未处于生产状态,从设备上卸载应用程序并重新安装将按要求进行。

【讨论】:

  • 在某些设备中有时需要重启设备。
  • 在奥利奥上,无论我怎么尝试,它似乎都不会消失。
  • 确认,在奥利奥,它不会消失。
  • 在模拟器中运行时,我不得不卸载并删除应用文件夹。
【解决方案3】:

如果您在更新实体时不关心迁移:

  1. 增加数据库版本
  2. 在建库时添加fallbackToDestructiveMigration()方法,例如:

    Room.databaseBuilder(appContext, AppDatabase.class, "appdb.db") .fallbackToDestructiveMigration() .build();

希望这对某人有所帮助;)

【讨论】:

    【解决方案4】:

    增加版本:

    @Database(entities = {EmployeeEntry.class}, version = 2, exportSchema = false)
    

    取自 link

    【讨论】:

      【解决方案5】:

      有 3 种方法可以修复此数据完整性异常。

      1) 如果您不想增加数据库版本并且可以承受数据丢失 在设备中安装新版本并再次启动应用程序后,只需从应用程序设置中清除您的应用程序数据,它就可以在没有数据完整性异常的情况下工作

      2)如果您可以增加数据库版本但仍然可以承受数据丢失 如果你想让它无缝(不会因为模式更新而崩溃),你可以简单地增加数据库版本(比如说从 1 到 2)并在 Database Builder fallbackToDestructiveMigration() 中提及默认迁移策略。然后在安装此应用程序时,您之前的数据库数据将被清除,您将不会收到此数据完整性异常。

      3) 如果您可以增加数据库版本并希望保存以前的数据 您需要增加您的数据库版本(比如说从 1 到 2),但还需要在您的应用程序中实现正确的迁移逻辑(基于您的较低版本和较高版本)。然后在安装新版本时,您将不会收到此数据完整性异常。 对于 Room 的迁移,您可以阅读 this 为迁移编写的好文章

      有关 Room 迁移的官方文档,请访问 link

      【讨论】:

      • 就我而言,第一个选项就足够了,而且效果很好。谢谢!!
      【解决方案6】:

      在我的情况下,重新安装没有帮助,而且我无法设置 android:allowBackup:true,因为我使用的库之一需要它。所以我去了设置>应用程序>我的应用程序,并清除了该应用程序的数据和内存。问题消失了;)

      【讨论】:

      • 这就是我们的答案。当我的伙伴的代码工作正常但我的代码却没有,这让我们疯狂地度过了充实的一天,两者都来自同一个分支提交......
      【解决方案7】:

      第 1 步:安装新版本

      第 2 步:从“设置”中清除所有应用数据。

      第 3 步:打开应用程序(现在可以正常工作)

      【讨论】:

        【解决方案8】:

        您也可以在终端中使用adb shell pm uninstall com.package.app 来完全卸载该应用程序。之后,重新安装,错误就会消失。

        【讨论】:

          猜你喜欢
          • 2017-10-27
          • 2021-08-07
          • 2020-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-15
          • 1970-01-01
          相关资源
          最近更新 更多