25

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

}

应用数据库类

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

8 回答 8

49

安卓6.0+

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

您可以简单地添加...

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

...禁用此功能,您就可以开始了(现在您可以简单地卸载以删除数据库)。

于 2018-02-02T09:00:26.683 回答
37

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

于 2017-06-14T11:36:46.247 回答
14

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

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

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

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

于 2018-07-05T13:25:49.307 回答
11

增加版本:

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

取自 链接

于 2018-11-14T03:55:35.487 回答
8

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

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

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

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

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

于 2019-11-26T06:07:31.223 回答
3

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

于 2018-11-12T18:49:20.490 回答
2

第 1 步:安装新版本

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

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

于 2019-07-02T09:58:08.380 回答
1

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

于 2020-04-26T08:44:26.893 回答