【发布时间】:2026-01-27 20:30:01
【问题描述】:
我有一个在 SQLite 浏览器中创建的数据库。到目前为止它有 34 个表,我还计划使用 ORMLite 进行数据库插入、删除等。 我的问题是,由于我是离线创建数据库的,所以我必须将数据库与应用程序一起提供。所以我将我的数据库保存在资产文件夹中,然后我尝试复制数据库。 浏览其他*帖子让我使用this code。我从我的 MainActivity 调用这个类,这样每当用户在我的应用程序中时,我都可以检查我的数据库是否存在。但事情并没有按预期工作。这是 logcat 输出link。它表明它在资产中找不到我的数据库文件。或者我可能是错的。请帮忙!谢谢!
MainActivity.java中的相关代码
AssetDatabaseOpenHelper adb = new AssetDatabaseOpenHelper(this);
SQLiteDatabase db = adb.openDatabase();
if(db.isOpen())
{
System.out.println("Database open, now closing");
db.close();
}
AssetDatabaseOpenHelper.java 中的相关代码。
private static final String DB_NAME = "mydb.db";
public SQLiteDatabase openDatabase() {
File dbFile = context.getDatabasePath(DB_NAME);
System.out.println(dbFile.toString());
//File databasefile = new File(context.getCacheDir(),"databases");
//System.out.println(databasefile.toString());
if (!dbFile.exists()) {
try {
//databasefile.mkdir();
copyDatabase(dbFile);
} catch (IOException e) {
throw new RuntimeException("Error creating source database", e);
}
}
return SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY);
}
private void copyDatabase(File dbFile) throws IOException {
InputStream is = context.getAssets().open(DB_NAME);
OutputStream os = new FileOutputStream(dbFile);
byte[] buffer = new byte[1024];
while (is.read(buffer) > 0) {
os.write(buffer);
}
os.flush();
os.close();
is.close();
}
Logcat:
11-08 16:24:03.773: E/Trace(5937): 打开跟踪文件时出错: 没有这样的文件或目录 (2) 11-08 16:28:32.524:电子/复制错误(7319):复制可能已中止 11-08 16:30:17.233:E/Trace(7890):打开跟踪文件时出错:没有这样的文件或目录 (2) 11-08 16:30:18.213:电子/复制错误(7890):复制可能已中止 11-08 16:32:57.994:E/Trace(8751):打开跟踪文件时出错:没有这样的文件或目录 (2) 11-08 16:32:58.773:电子/复制错误(8751):复制可能已中止 11-08 16:42:46.534:E/Trace(11771):打开跟踪文件时出错:没有这样的文件或目录 (2) 11-08 16:42:47.164:E/AndroidRuntime(11771):致命异常:主要 11-08 16:42:47.164: E/AndroidRuntime(11771): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.[packagename ommitted]/com.[packagename ommitted].MainActivity}: java.lang.RuntimeException : 创建源数据库时出错 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.os.Handler.dispatchMessage(Handler.java:99) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.os.Looper.loop(Looper.java:137) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.ActivityThread.main(ActivityThread.java:5041) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 java.lang.reflect.Method.invokeNative(Native Method) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 java.lang.reflect.Method.invoke(Method.java:511) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 11-08 16:42:47.164:E/AndroidRuntime(11771):在 dalvik.system.NativeStart.main(本机方法) 11-08 16:42:47.164:E/AndroidRuntime(11771):原因:java.lang.RuntimeException:创建源数据库时出错 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 [包名省略].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:29) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 [包名省略].MainActivity.onCreate(MainActivity.java:65) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.Activity.performCreate(Activity.java:5104) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 11-08 16:42:47.164: E/AndroidRuntime(11771): ... 11 更多 11-08 16:42:47.164: E/AndroidRuntime(11771): 由: java.io.FileNotFoundException: /data/data/[packagename ommitted]/databases/mydb.db: open failed: ENOENT (没有这样的文件或目录) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 libcore.io.IoBridge.open(IoBridge.java:416) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 java.io.FileOutputStream.(FileOutputStream.java:88) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 java.io.FileOutputStream.(FileOutputStream.java:73) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 [包名省略].db.AssetDatabaseOpenHelper.copyDatabase(AssetDatabaseOpenHelper.java:38) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 [包名省略].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:27) 11-08 16:42:47.164: E/AndroidRuntime(11771): ... 15 更多 11-08 16:42:47.164:E/AndroidRuntime(11771):原因:libcore.io.ErrnoException:打开失败:ENOENT(没有这样的文件或目录) 11-08 16:42:47.164:E/AndroidRuntime(11771):在 libcore.io.Posix.open(本机方法) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 11-08 16:42:47.164: E/AndroidRuntime(11771): 在 libcore.io.IoBridge.open(IoBridge.java:400) 11-08 16:42:47.164: E/AndroidRuntime(11771): ... 19 更多 11-08 16:45:36.693:E/Trace(12662):打开跟踪文件时出错:没有这样的文件或目录 (2) 11-08 16:45:37.293:E/AndroidRuntime(12662):致命异常:主要 11-08 16:45:37.293: E/AndroidRuntime(12662): java.lang.RuntimeException: 无法启动活动 ComponentInfo{[packagename ommitted]/[packagename ommitted].MainActivity}: java.lang.RuntimeException: 创建源时出错数据库 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.os.Handler.dispatchMessage(Handler.java:99) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.os.Looper.loop(Looper.java:137) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.ActivityThread.main(ActivityThread.java:5041) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 java.lang.reflect.Method.invokeNative(Native Method) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 java.lang.reflect.Method.invoke(Method.java:511) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 11-08 16:45:37.293: E/AndroidRuntime(12662): at dalvik.system.NativeStart.main(Native Method) 11-08 16:45:37.293:E/AndroidRuntime(12662):原因:java.lang.RuntimeException:创建源数据库时出错 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 [包名省略].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:29) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 [包名省略].MainActivity.onCreate(MainActivity.java:65) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.Activity.performCreate(Activity.java:5104) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 11-08 16:45:37.293: E/AndroidRuntime(12662): ... 11 更多 11-08 16:45:37.293: E/AndroidRuntime(12662): 由: java.io.FileNotFoundException: /data/data/[packagename ommitted]/databases/mydb.db: open failed: ENOENT (没有这样的文件或目录) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 libcore.io.IoBridge.open(IoBridge.java:416) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 java.io.FileOutputStream.(FileOutputStream.java:88) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 java.io.FileOutputStream.(FileOutputStream.java:73) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 [包名省略].db.AssetDatabaseOpenHelper.copyDatabase(AssetDatabaseOpenHelper.java:38) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 [包名省略].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:27) 11-08 16:45:37.293: E/AndroidRuntime(12662): ... 15 更多 11-08 16:45:37.293:E/AndroidRuntime(12662):原因:libcore.io.ErrnoException:打开失败:ENOENT(没有这样的文件或目录) 11-08 16:45:37.293:E/AndroidRuntime(12662):在 libcore.io.Posix.open(本机方法) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 11-08 16:45:37.293: E/AndroidRuntime(12662): 在 libcore.io.IoBridge.open(IoBridge.java:400) 11-08 16:45:37.293: E/AndroidRuntime(12662): ... 19 更多【问题讨论】:
-
您应该确保数据库路径存在。我假设您正在尝试将数据库复制到一个不存在的目录中。
-
请在此处发布使用的代码。没有理由提供链接,因为代码量会很小。也在这里发布logcat。你没有告诉你要将数据库文件复制到哪里。
-
@Robert 你的假设似乎是正确的。如果我从文件资源管理器中手动创建 data/data/package-name/ 中的文件夹“databases”,则数据库副本是成功的。但是,我不能从我的程序中做到这一点,即首先创建目录。试过 mkdir() 不起作用。
-
@greenapps 我分享了一个 github 链接,这就是我所指的代码。相同的代码指向我要复制文件的位置。 context.getDatabasePath(DB_NAME) 指向 /data/data/package-name'/databases/database-name
-
如果
File dbFile = context.getDatabasePath(DB_NAME);是文件 "/data/data/[packagename ommitted]/databases/mydb.db" 那么你应该检查 "/data/data/[packagename ommitted]/databases"存在。如果不创建它。你可以使用if ( ! dbFile.getParentFile().exists() ) dbFile.getParentFile().mkdir();
标签: android database sqlite assets