【问题标题】:Room and SQLiteDatabaseCorruptExceptionRoom 和 SQLiteDatabaseCorruptException
【发布时间】:2018-12-17 14:18:03
【问题描述】:

刚刚在我的游戏控制台中看到了一份报告:

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)

谁知道处理这些问题的好方法?尤其是在使用 LiveData 时,我还没有看到处理这个问题的好方法。还有什么是重现这个的好方法 - 那么我如何优雅地破坏数据库?

【问题讨论】:

    标签: android android-room


    【解决方案1】:

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

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

    编辑:好的,it seems it's possible to fix a SQLite database 但这实际上取决于它的损坏程度,因此您可能不会编写通用代码来修复它们。

    还有什么是重现这个的好方法 - 那么我该如何破坏 数据库优雅吗?

    您必须在有根手机上重现它,因为您将无法通过标准 SQLite 语句破坏数据库(它们专门用于防止这种情况发生)。

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

    //data/data/<Your-Application-Package-Name>/databases/<your-database-name>
    

    你可以用任何编辑器打开它,然后把它弄乱(删除一堆行然后保存)。这可能会损坏文件,您将拥有SQLiteDatabaseCorruptException

    【讨论】:

    • 谢谢 - 但这是对 SQLiteDatabaseCorruptException 的一般回答 - 我对 SQLiteDatabaseCorruptException+room/LiveData 更感兴趣。例如。如何捕捉这个错误。目前我什至看不到正确捕获它的方法,因为数据库调用代码在房间里而不是直接在我的代码中 - 所以我什至无法将它包装在 try/catch
    猜你喜欢
    • 2013-01-12
    • 2022-01-09
    • 2019-07-17
    • 2017-10-19
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多