Room和SQLiteDatabaseCorruptException

lig*_*igi 6 android android-room

刚刚在我的游戏机中看到一个报告:

android.database.sqlite.SQLiteDatabaseCorruptException: 
  at android.database.sqlite.SQLiteConnection.nativePrepareStatement (Native Method)
  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement (SQLiteConnection.java:903)
  at android.database.sqlite.SQLiteConnection.executeForString (SQLiteConnection.java:648)
  at android.database.sqlite.SQLiteConnection.setJournalMode (SQLiteConnection.java:333)
  at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration (SQLiteConnection.java:298)
  at android.database.sqlite.SQLiteConnection.open (SQLiteConnection.java:217)
  at android.database.sqlite.SQLiteConnection.open (SQLiteConnection.java:195)
  at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked (SQLiteConnectionPool.java:503)
  at android.database.sqlite.SQLiteConnectionPool.open (SQLiteConnectionPool.java:204)
  at android.database.sqlite.SQLiteConnectionPool.open (SQLiteConnectionPool.java:196)
  at android.database.sqlite.SQLiteDatabase.openInner (SQLiteDatabase.java:920)
  at android.database.sqlite.SQLiteDatabase.open (SQLiteDatabase.java:908)
  at android.database.sqlite.SQLiteDatabase.openDatabase (SQLiteDatabase.java:767)
  at android.database.sqlite.SQLiteDatabase.openDatabase (SQLiteDatabase.java:757)
  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:355)
  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:298)
  at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase (FrameworkSQLiteOpenHelper.java:96)
  at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase (FrameworkSQLiteOpenHelper.java:54)
  at android.arch.persistence.room.RoomDatabase.query (RoomDatabase.java:233)
  at org.walleth.data.transactions.TransactionDAO_Impl$8.compute (TransactionDAO_Impl.java:1228)
  at org.walleth.data.transactions.TransactionDAO_Impl$8.compute (TransactionDAO_Impl.java:1214)
  at android.arch.lifecycle.ComputableLiveData$2.run (ComputableLiveData.java:100)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
  at java.lang.Thread.run (Thread.java:764)
Run Code Online (Sandbox Code Playgroud)

谁知道处理这些问题的好方法?特别是在使用LiveData时,我还没有看到解决此问题的好方法.还有什么是重现这一点的好方法 - 那么如何优雅地破坏数据库呢?

Art*_*out 0

有谁知道处理这些问题的好方法吗?

好吧,如果你的数据库损坏了,它就损坏了。除非从头开始重新创建,否则您可能无法修复它。但是,如果您想在执行任何操作之前检查它是否有效,请参阅这篇文章:Android: Check if a file is a valid SQLite database

编辑:好的,似乎可以修复 SQLite 数据库,但这实际上取决于它的损坏程度,因此您很可能不会编写通用代码来修复它们。

另外,重现此问题的好方法是什么 - 那么我如何优雅地损坏数据库?

您必须在已 root 的手机上重现它,因为您将无法通过标准 SQLite 语句损坏数据库(它们是专门为防止这种情况而设计的)。

拿一个虚拟手机(或模拟器),然后root它,并访问此文件:

//data/data/<Your-Application-Package-Name>/databases/<your-database-name>
Run Code Online (Sandbox Code Playgroud)

您可以使用任何编辑器打开它,然后对其进行修改(删除一堆行然后保存)。这很可能会损坏文件,并且您将拥有SQLiteDatabaseCorruptException