房间无法验证Android中的数据完整性

时间:2017-06-14 11:33:41

标签: android sqlite android-room

  

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();
    }
  

ProfileDao

@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.

8 个答案:

答案 0 :(得分:26)

Android 6.0 +

对于那些现在遇到这种情况的人来说,简单地卸载可能没什么用,它会让你疯狂,所以在你必须解决之前,让我分享一下这个问题:谷歌推出了&#34; autobackup& #34;功能 Android 6.0,重新安装时会重新启动数据库。 (https://developer.android.com/guide/topics/data/autobackup.html

你可以简单地添加......

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

...要禁用此功能,您可以继续使用(现在只需卸载即可删除数据库)。

答案 1 :(得分:20)

如果您目前仅开发应用程序,则意味着您尚未开始生产并从设备卸载应用程序并再次安装它将按要求运行。

答案 2 :(得分:5)

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

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

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

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

答案 3 :(得分:4)

增加版本:

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

link

答案 4 :(得分:2)

对于我来说,重新安装没有帮助,我也无法设置android:allowBackup:true,因为我使用的其中一个库需要它。所以我去了设置>应用程序>我的应用程序,并清除了该应用程序的数据和内存。问题消失了;)

答案 5 :(得分:1)

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

答案 6 :(得分:0)

第1步:安装新版本

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

第3步:打开应用(现在可以正常使用)

答案 7 :(得分:0)

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

1)如果您不想增加数据库版本,并且可能会造成数据丢失 在安装了新的内置设备并再次启动App之后,只需从App设置中清除App数据,即可正常工作而不会出现数据完整性异常

2)如果您可以增加数据库版本,但仍然可以承受数据丢失 如果要使其无缝(由于架构更新而不会崩溃),则只需增加数据库版本(从1到2),并在Database Builder fallbackToDestructiveMigration()中提及默认迁移策略。然后,在安装此应用程序时,您之前的数据库数据将被清除,并且不会出现此数据完整性异常的情况。

3)如果您可以增加数据库版本并且还想保存以前的数据 您需要将数据库版本增加(从1增加到2),还需要在App中实现适当的迁移逻辑(基于较低版本和较高版本)。然后,在安装新版本时,将不会出现此数据完整性异常。 对于Room的迁移,您可以阅读this不错的关于迁移的文章

有关Room迁移的正式文档,请访问link