【发布时间】: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/… 也许这可以帮助您发现损坏的问题。