【发布时间】:2012-11-16 07:33:28
【问题描述】:
我有一个预填充的数据库,我已离线创建并放入 assets/ 目录。我正在尝试在调用SQLiteOpenHelper.onCreate() 时复制它,但我遇到了严重的麻烦。
public void onCreate(SQLiteDatabase db) {
importAssets();
}
当我编写这样的代码时,在随后尝试从数据库中获取数据时,我总是收到 no such table 错误。我做了一些处理,开始将 SQL 语句插入到onCreate() 以及对importAssets() 的调用中,例如:
public void onCreate(SQLiteDatabase db) {
importAssets();
db.execSQL("CREATE TABLE main_table (some_col);");
}
现在,当我运行应用程序时,我遇到了 column not found 错误(上面的架构与 DB 访问代码所期望的不匹配,它缺少一些列。在应用程序的第二次运行,android_metatdata 被破坏,然后一切都陷入困境。我还尝试使用importAssets() 调用之前的 SQL 代码,结果同样是灾难性的。
所以我开始认为我在importAssets() 中所做的文件副本基本上被onCreate() 截断了。我对吗?是直接使用 SQL 在onCreate() 中创建数据库的唯一方法吗?不能用这个功能从assets/复制现成的DB吗?
我已通过使用Log() 调用确认importAssets() 正在正常运行。这是完整的功能:
private void importAssets() throws IOException
{
AssetManager am = mCtx.getAssets();
InputStream in = am.open(DB_NAME);
FileOutputStream out;
byte[] buffer = new byte[1024];
int len;
File db;
db = new File(DB_DIR + "/" + DB_NAME);
// copy the DB from assets to standard DB dir created above
out = new FileOutputStream(db);
while ((len = in.read(buffer)) > 0)
{
out.write(buffer, 0, len);
}
out.flush();
out.close();
in.close();
if (!db.exists())
{
Log.e(TAG, DB_DIR + "/" + DB_NAME + " does not exist");
}
}
我已经看到 elsewhere 建议我在 SQLiteOpenHelper 构造函数中进行文件复制,但这意味着我必须手动检查 importAssets() 中的文件是否存在,因为每次我都会调用构造函数使用数据库。此外,onCreate() 对于我想做的事情实际上毫无用处,尽管我看不出有任何方法可以避免这种情况。
【问题讨论】:
标签: android android-sqlite android-assets