Saya mendapatkan error ini saat menjalankan program dengan Room Database
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.
Sepertinya kita perlu mengupdate versi Database, tapi dari mana kita bisa melakukannya di Room?
Jawaban:
Saat Anda pertama kali menemukan pesan ini, kemungkinan besar Anda akan bekerja dengan versi database yang belum dirilis. Jika demikian, kemungkinan besar Anda sebaiknya tidak menaikkan versi database . Cukup menghapus data aplikasi akan membuat Anda melewati pengecualian.
Jika Anda tidak menaikkan database (disarankan):
Anda harus menghapus data aplikasi aplikasi dari pengaturan Android. Sebagai alternatif, Anda mungkin dapat mencopot pemasangan versi aplikasi sebelumnya dan kemudian memasang versi baru untuk lolos pengecualian. Pendekatan terakhir ini tidak berfungsi dalam kondisi tertentu (seperti ketika izinkan pencadangan diaktifkan)
Karena menghapus data aplikasi selalu berhasil, saya mengambil rute itu setiap saat.
Jika Anda meningkatkan versi database:
Anda perlu menulis kode migrasi database ke akun untuk setiap perubahan pada skema database. Lihat di sini untuk informasi tentang migrasi.
Alternatif untuk menulis kode migrasi database adalah dengan memanggil
fallbackToDestructiveMigration
pembuat database Room. Ini mungkin bukan ide yang bagus. Lupa menghapus panggilan ini dan kemudian lupa mengupgrade database akan mengakibatkan kehilangan data.// Using this fallback is almost certainly a bad idea Database database = Room.databaseBuilder(context, Database.class, DATABASE_NAME) .fallbackToDestructiveMigration() .build();
Sekali lagi, tidak perlu menaikkan versi database atau mundur ke migrasi destruktif jika skema database sebelumnya tidak aktif .
sumber
1.0.0-rc1
Room, satu-satunya hal yang berhasil bagi saya adalah meningkatkan versi database.Secara default, manifes Android memiliki
android:allowBackup="true"
, Yang memungkinkan aplikasi mempertahankan DB SQLite mereka saat penginstalan ulang.Misalkan Anda
DATABASE_VERSION
awalnya 3 dan kemudian Anda memutuskan untuk mengurangi versi DB dari 3 menjadi 1.@Database(entities = {CallRecording.class}, version = DATABASE_VERSION) public abstract class AppDatabase extends RoomDatabase { public abstract RecordingDAO recordingDAO(); // static final Migration MIGRATION_1_2 = new Migration(1, 2) { // @Override // public void migrate(SupportSQLiteDatabase database) { // // Since we didn't alter the table, there's nothing else to do here. // } // }; }
Anda bisa mencapainya seperti ini
Ini adalah praktik yang baik untuk tetap
DATABASE_VERSION
konstan.sumber
android: allowBackup = "true" di dalam AndroidManifest.xml mencegah data dihapus bahkan setelah aplikasi di-uninstal.
Tambahkan ini ke manifes Anda:
android:allowBackup="false"
dan instal ulang aplikasi.
Catatan: Pastikan Anda mengubahnya kembali ke true nanti jika Anda ingin backup otomatis.
Solusi lain:
Periksa identitasHash file json lama Anda dan file json baru di folder apps \ schema.
Jika identitasHash berbeda, itu akan memberikan kesalahan itu. Cari tahu apa yang telah Anda ubah dengan membandingkan kedua file json jika Anda tidak ingin mengubah apa pun.
Pastikan Anda memiliki exportSchema = true.
@Database(entities = {MyEntity.class, ...}, version = 2, exportSchema = true)
file skema json:
"formatVersion": 1, "database": { "version": 2, "identityHash": "53cc5ef34d2ebd33c8518d79d27ed012", "entities": [ {
kode:
private void checkIdentity(SupportSQLiteDatabase db) { String identityHash = null; if (hasRoomMasterTable(db)) { Cursor cursor = db.query(new SimpleSQLiteQuery(RoomMasterTable.READ_QUERY)); //noinspection TryFinallyCanBeTryWithResources try { if (cursor.moveToFirst()) { identityHash = cursor.getString(0); } } finally { cursor.close(); } } if (!mIdentityHash.equals(identityHash) && !mLegacyHash.equals(identityHash)) { throw new 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."); } }
sumber
Jawaban Aniruddh Parihar memberi saya petunjuk dan itu terpecahkan.
Cari kelas yang sudah Anda kembangkan
RoomDatabase
. Di sana Anda akan menemukan versi seperti di bawah ini:@Database(entities = {YourEntity.class}, version = 1)
tingkatkan saja versi dan masalah terpecahkan.
sumber
Sangat sederhana seperti yang ditunjukkan pada log
Looks like you've changed schema but forgot to update the Database version number. You can simply fix this by increasing the version number.
Cukup buka kelas Versi Database Anda dan tingkatkan versi DB Anda dengan meningkatkan 1 dari saat ini.
@Database(entities = {YourEntityName.class}, version = 1)
sumber
It seems we need to update database version
. Tetapi saya tidak mengerti di mana versi itu disebutkan. Terima kasih untuk petunjuk itu.1: - Sepertinya kita perlu memperbarui versi database (selisih 1)
2. Copot pemasangan aplikasi atau Hapus data aplikasi
sumber
Di ponsel android:
Untuk menghapus data aplikasi: Buka pengaturan -> Aplikasi -> Pilih aplikasi Anda -> Penyimpanan -> Hapus data
Penghapusan (dan instal ulang) tidak berfungsi di setiap kasus, jadi coba hapus data terlebih dahulu!
sumber
Dalam kasus saya
android:allowBackup="false"
membuatnya dari true menjadi false berfungsi, karena ini telah memberi saya mimpi buruk sebelumnya juga, ini adalah hal paling aneh mengapa pengaturan ini diaktifkan secara default!sumber
Untuk memperbaiki masalah di kotlin:
Pertama
@Database(entities = [Contact::class], version = 2)
Kedua
val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE Contact ADD COLUMN seller_id TEXT NOT NULL DEFAULT ''") } }
Ketiga
private fun buildDatabase(context: Context) = Room.databaseBuilder( context.applicationContext, EpayDatabase::class.java, "epay" ) .addMigrations(MIGRATION_1_2) .build()
Untuk lebih jelasnya, lihat dokumentasi resmi
sumber
Masalah ini sebagian besar terjadi dalam pengembangan.
Jika Anda mengubah skema, yaitu, ganti nama / tambahkan / modifikasi kelas Anda yang berisi entitas tabel, integritas antara keluar dari db di build sebelumnya bertentangan dengan build baru.
Sekarang, db lama tidak akan konflik dengan yang lebih baru.
sumber
android:allowBackup="true"
dan menggunakannya dengan bijakDalam kasus saya, saya memiliki kelas AppDatabase.
@Database(entities = {GenreData.class, MoodData.class, SongInfo.class, AlbumsInfo.class, UserFolderListsData.class, UserPlaylistResponse.PlayLists.class, InternetConnectionModel.class}, version = 3, exportSchema = false)
Saya memperbarui nomor versi ini dan itu menyelesaikan masalah. Masalah muncul karena saya telah menambahkan properti di kelas SongInfo dan lupa memperbarui nomor versi.
Semoga bisa membantu seseorang.
sumber
Jika Anda mengupgrade versi Room ke 1.0.0-alpha9 dari versi lama, silakan kunjungi artikel di bawah ini. Artikel Sangat Bagus untuk Bermigrasi dari versi lama ke versi 1.0.0-alpha9.
https://medium.com/@manuelvicnt/android-room-upgrading-alpha-versions-needs-a-migration-with-kotlin-or-nonnull-7a2d140f05b9
Dalam Room Versi Baru 1.0.0-alpha9 Room menambahkan dukungan untuk batasan NOT NULL.
Itu akan mengubah skema yang dihasilkan Room. Karena mengubah skema, ini juga mengubah identityHash dari DB dan yang digunakan oleh Room untuk mengidentifikasi setiap versi DB secara unik. Oleh karena itu, diperlukan migrasi
sumber
Dalam kasus saya, ContentProvider dan database ruangan bekerja sama, jadi pertama-tama hapus semua callback ContentProvider di seluruh aplikasi dengan kelas database yang memperluas SqlLiteOpenHelper Class
sumber
Dalam kasus saya, saya menggunakan transaksi di dalam migrasi dan Room tidak dapat memperbarui hash menggunakan Pembantu Migrasi
@get:Rule val migrationTestHelper: MigrationTestHelper = MigrationTestHelper(InstrumentationRegistry.getInstrumentation(), C2GDatabase::class.java.canonicalName, FrameworkSQLiteOpenHelperFactory()) /* Testing method throws error*/ db = migrationTestHelper.runMigrationsAndValidate(C2GDatabase.DB_NAME, 3, false, C2GDatabase.Migration_1_2(), C2GDatabase.Migration_2_3()) override fun migrate(database: SupportSQLiteDatabase) { /** Error database.beginTransaction() **/ database.execSQL("PRAGMA foreign_keys=off;") database.execSQL("ALTER TABLE user RENAME TO user_old;") database.execSQL("CREATE TABLE user ( id_user INTEGER PRIMARY KEY AUTOINCREMENT, external_id INTEGER NOT NULL;") database.execSQL("INSERT INTO user ( id_user, external_id ) " + " SELECT id_user, external_id" + " FROM user_old;") database.execSQL("CREATE UNIQUE INDEX idx_unique_user ON user (external_id);") database.execSQL("PRAGMA foreign_keys=on;") database.execSQL("DROP TABLE user_old;") //database.endTransaction() }
sumber
@Database(entities = {Tablename1.class, Tablename2.class}, version = 3, exportSchema = false)
Ubah nomor versi di kelas RoomDatabase Anda. Tingkatkan nomor versi.
sumber
Jika peningkatan versi skema tidak berhasil, berikan migrasi database Anda. Untuk melakukannya, Anda perlu mendeklarasikan migrasi di pembuat database:
Room.databaseBuilder(context, RepoDatabase.class, DB_NAME) .addMigrations(FROM_1_TO_2) .build(); static final Migration FROM_1_TO_2 = new Migration(1, 2) { @Override public void migrate(final SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE Repo ADD COLUMN createdAt TEXT"); } };
sumber
Saya baru saja mengalami masalah serupa dalam pengujian espresso dan satu-satunya hal yang memperbaikinya adalah menghapus data dan juga mencopot aplikasi uji androidx seperti:
adb uninstall androidx.test.orchestrator adb uninstall androidx.test.services
sumber
Dalam kasus saya, saya membuat pembaruan ke database yang akan saya paketkan sebelumnya dengan aplikasi saya. Tidak ada saran di sini yang berhasil. Tetapi akhirnya saya menemukan bahwa saya dapat membuka file .db dalam program database (saya menggunakan "DB Browser for SQLite"), dan secara manual mengubah "Versi pengguna" dari 2 kembali ke 1. Setelah itu, ini bekerja dengan sempurna.
Saya kira setiap pembaruan yang Anda buat mengubah versi pengguna ini, dan inilah mengapa saya terus mendapatkan kesalahan ini.
sumber
Dalam kasus saya, saya mencoba semua hal di atas. Sepertinya tidak ada yang berhasil, jadi solusi bagi saya hanyalah mengatur
android:allowBackup="false"
, menginstal aplikasi, lalu mengaturnya kembali ke trueSemoga bisa membantu orang lain :)
sumber
Saya mendapat kesalahan yang sama selama program pelatihan Codelabs. Dimana Dalam satu sesi pelatihan saya membuat sebuah proyek dan itu berjalan dengan sukses dengan semua operasi database. Pada sesi berikutnya, saya bekerja dengan repo yang berbeda, tetapi itu merupakan perpanjangan dari proyek sebelumnya, Dari versi pertama aplikasi yang diperpanjang, hanya saya yang mendapat kesalahan.
sumber