Комната не может проверить целостность данных в Android


Класс 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);
}

Здесь я получил ошибку после первого запуска приложения. Похоже, что приложение пытается создать базу данных еще раз, но уже есть существующая, поэтому они предложили изменить код версии. Мое требование заключается в том, что мне нужно только вставить новый набор данных. Как я могу этого достичь? Заранее спасибо. Вот это и есть 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.
3 7

3 ответа:

Если вы только разрабатываете приложение в данный момент, это означает, что вы не находитесь на производстве и удаление приложения с устройства и установка его снова будет работать по мере необходимости.

Android 6.0+

Для тех из вас, кто столкнулся с этим сейчас, простое удаление может не помочь, и это сведет вас с ума, поэтому, прежде чем вы должны выяснить это, позвольте мне поделиться проблемой: Google ввел функциональность "autobackup" в Android 6.0, который возвращает БД при переустановке. (https://developer.android.com/guide/topics/data/autobackup.html )

Вы можете просто добавить...

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

... чтобы отключить эту функцию, и вы хорошо идете (теперь вы можете просто удалить, чтобы удалить базу данных).

Если вас не волнуют миграции при обновлении сущностей:

  1. увеличить версию базы данных
  2. Добавить метод fallbackToDestructiveMigration() во время построения базы данных, например:

    {[1-комнатный.databaseBuilder (appContext, AppDatabase.класс, " appdb.дБ") .fallbackToDestructiveMigration() .build ();

Надеюсь, это кому-то поможет;)