【问题标题】:Android - Error Code 11 when importing Sqlite Database on Galaxy NoteAndroid - 在 Galaxy Note 上导入 Sqlite 数据库时出现错误代码 11
【发布时间】:2012-10-23 11:05:10
【问题描述】:

我正在使用下面的代码从资产中导入预填充 (ORMLite) 数据库。

这在多个设备上都可以正常工作,但在 Galaxy Note 10.1 上除外。操作完成后关闭数据库时出现异常:

"error code = 11, msg = database corruption at line ...."

当我从设备下载数据库并在 SqliteBrowser 中打开它时,一切似乎都很好。有什么想法吗?

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

// {....}

public void importDB() {

    InputStream is = context.getAssets().open("DBName.db");

    try {
        close();
        FileOutputStream os = new FileOutputStream(new File(Environment.getDataDirectory(), dbPath));
        try {
            byte[] buffer = new byte[4096];
            for (int n; (n = is.read(buffer)) != -1;) {
                os.write(buffer, 0, n);
            }
        } finally {
            os.close();
        }
    } finally {
        is.close();
    }
    getWritableDatabase().close();
}

错误:

I/SqliteDatabaseCpp(684): sqlite returned: error code = 11, msg = database         corruption at line 48171 of [ed759d5a9e], db=/data/data/app_name/databases/DBName_db
I/SqliteDatabaseCpp(684): sqlite returned: error code = 11, msg = database disk image is malformed, db=/data/data/app_name/databases/DBName_db
E/SqliteDatabaseCpp(684): sqlite3_exec - Failed to set synchronous mode = 1(Normal) 
I/SqliteDatabaseCpp(684): sqlite returned: error code = 11, msg = database corruption at line 48171 of [ed759d5a9e], db=/data/data/app_name/databases/DBName_db
I/SqliteDatabaseCpp(684): sqlite returned: error code = 11, msg = database disk image is malformed, db=/data/data/app_name/databases/DBName_db
E/SqliteDatabaseCpp(684): CREATE TABLE android_metadata failed
E/DefaultDatabaseErrorHandler(684): Corruption reported by sqlite on database: /data/data/app.name/databases/DBName.db
E/DefaultDatabaseErrorHandler(684): deleting the database file: /data/data/app.name/databases/DBName.db

【问题讨论】:

  • 我不知道它与 ORMLite 的结合程度如何,但是 package-the-DB-in-assets 模式有一个标准实现,形式为 SQLiteAssetHelper: github.com/jgilfelt/android-sqlite-asset-helper
  • 这绝对不是一件容易的事,因为 ORMLite 提供了自己的帮助器类 OrmLiteSqliteOpenHelper。感谢您的提示。
  • 这是可重复的还是一次性事件?无论如何:我想知道您的代码中的两个 close() 语句。此时数据库无论如何都不存在,对吧?他们有必要吗?最后:哪条线导致了这个问题? getWritableDatabase().close()?
  • 每次我尝试在 Note10.1 上初始化数据库时,它都可以重现。第一个 close() 只是一种预防措施,但不是必需的。数据库是在应用程序首次启动时由 ormlite 创建的。在 getWritableDatabase().close() 上抛出错误。
  • 另请参阅此博客文章:techblog.dorogin.com/2011/05/… 也许这可以帮助您发现损坏的问题。

标签: android sqlite ormlite


【解决方案1】:

在关闭 FileOutputStream 之前,您始终必须同步:os.getFD().sync()。这与文件系统有关。有些人会在他们认为合适的时候写作——这可能会造成麻烦。

【讨论】:

  • 谢谢,这非常有用,虽然它没有修复错误。我在帖子中添加了错误日志
【解决方案2】:

从 logcat 输出中可以看出,您没有为 DatabaseErrorHandler 提供自定义实现,而隐式处理程序 (DefaultDatabaseErrorHandler) 只是删除损坏的数据库。您应该使用 DefaultDatabaseErrorHandler 的实现

您应该运行 PRAGMA 完整性检查;在恢复的数据库上。这通常返回字符串“ok”,否则您可以解析该字符串,例如,如果您找到一个索引,您可以删除并重新创建它。

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    public MySQLiteOpenHelper(final Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION, new DatabaseErrorHandler() {
            @Override
            public void onCorruption(SQLiteDatabase db) {
                //your code
            }
        });
    }

    // {....}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2013-05-08
    • 2018-12-05
    相关资源
    最近更新 更多