I have a database that I created in SQLite Browser. It has so far 34 tables and I am also planning to use ORMLite to do database insert, delete etc. My problem is, since I created the database offline, I will have to ship the database with the app. So I kept my database in the assets folder and then I tried to copy the database. Going through other stackoverflow posts made me to use this code. I call this class from my MainActivity so that whenever user is inside my app, I can check if my database is there or not. But things aren't working as expected. Here is the logcat output link. It shows that it can't find my database file in the assets. Or I may be wrong. Please help! Thanks!

我在SQLite浏览器中创建了一个数据库。它迄今为止34表和我也计划使用ORMLite执行数据库插入、删除等。我的问题是,既然我创建了数据库离线,我将船数据库与应用。所以我保持我的数据库在资产的文件夹中,然后我试图复制数据库。通过其他stackoverflow帖子,我使用了这个代码。我从主活动中调用这个类,这样每当用户在我的应用中,我就可以检查我的数据库是否在那里。但事情并没有像预期的那样发展。这是logcat输出链接。它显示在资产中找不到我的数据库文件。或者我可能错了。请帮助!谢谢!

Relevant Codes in MainActivity.java

相关代码在MainActivity.java

AssetDatabaseOpenHelper adb = new AssetDatabaseOpenHelper(this);
    SQLiteDatabase db = adb.openDatabase();
    if(db.isOpen())
    {
        System.out.println("Database open, now closing");
        db.close();
    }

Relevant Codes in AssetDatabaseOpenHelper.java.

在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:

Logcat:

11-08 16:24:03.773: E/Trace(5937): error opening trace file: No such file or directory (2)
11-08 16:28:32.524: E/Copy Error(7319): Copy may have been aborted
11-08 16:30:17.233: E/Trace(7890): error opening trace file: No such file or directory (2)
11-08 16:30:18.213: E/Copy Error(7890): Copy may have been aborted
11-08 16:32:57.994: E/Trace(8751): error opening trace file: No such file or directory (2)
11-08 16:32:58.773: E/Copy Error(8751): Copy may have been aborted
11-08 16:42:46.534: E/Trace(11771): error opening trace file: No such file or directory (2)
11-08 16:42:47.164: E/AndroidRuntime(11771): FATAL EXCEPTION: main
11-08 16:42:47.164: E/AndroidRuntime(11771): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.[packagename ommitted]/com.[packagename ommitted].MainActivity}: java.lang.RuntimeException: Error creating source database
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.os.Looper.loop(Looper.java:137)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.ActivityThread.main(ActivityThread.java:5041)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at java.lang.reflect.Method.invokeNative(Native Method)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at java.lang.reflect.Method.invoke(Method.java:511)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at dalvik.system.NativeStart.main(Native Method)
11-08 16:42:47.164: E/AndroidRuntime(11771): Caused by: java.lang.RuntimeException: Error creating source database
11-08 16:42:47.164: E/AndroidRuntime(11771):    at [packagename ommitted].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:29)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at [packagename ommitted].MainActivity.onCreate(MainActivity.java:65)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.Activity.performCreate(Activity.java:5104)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
11-08 16:42:47.164: E/AndroidRuntime(11771):    ... 11 more
11-08 16:42:47.164: E/AndroidRuntime(11771): Caused by: java.io.FileNotFoundException: /data/data/[packagename ommitted]/databases/mydb.db: open failed: ENOENT (No such file or directory)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at libcore.io.IoBridge.open(IoBridge.java:416)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at java.io.FileOutputStream.(FileOutputStream.java:88)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at java.io.FileOutputStream.(FileOutputStream.java:73)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at [packagename ommitted].db.AssetDatabaseOpenHelper.copyDatabase(AssetDatabaseOpenHelper.java:38)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at [packagename ommitted].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:27)
11-08 16:42:47.164: E/AndroidRuntime(11771):    ... 15 more
11-08 16:42:47.164: E/AndroidRuntime(11771): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at libcore.io.Posix.open(Native Method)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
11-08 16:42:47.164: E/AndroidRuntime(11771):    at libcore.io.IoBridge.open(IoBridge.java:400)
11-08 16:42:47.164: E/AndroidRuntime(11771):    ... 19 more
11-08 16:45:36.693: E/Trace(12662): error opening trace file: No such file or directory (2)
11-08 16:45:37.293: E/AndroidRuntime(12662): FATAL EXCEPTION: main
11-08 16:45:37.293: E/AndroidRuntime(12662): java.lang.RuntimeException: Unable to start activity ComponentInfo{[packagename ommitted]/[packagename ommitted].MainActivity}: java.lang.RuntimeException: Error creating source database
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.os.Looper.loop(Looper.java:137)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.ActivityThread.main(ActivityThread.java:5041)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at java.lang.reflect.Method.invokeNative(Native Method)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at java.lang.reflect.Method.invoke(Method.java:511)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at 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): Caused by: java.lang.RuntimeException: Error creating source database
11-08 16:45:37.293: E/AndroidRuntime(12662):    at [packagename ommitted].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:29)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at [packagename ommitted].MainActivity.onCreate(MainActivity.java:65)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.Activity.performCreate(Activity.java:5104)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
11-08 16:45:37.293: E/AndroidRuntime(12662):    ... 11 more
11-08 16:45:37.293: E/AndroidRuntime(12662): Caused by: java.io.FileNotFoundException: /data/data/[packagename ommitted]/databases/mydb.db: open failed: ENOENT (No such file or directory)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at libcore.io.IoBridge.open(IoBridge.java:416)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at java.io.FileOutputStream.(FileOutputStream.java:88)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at java.io.FileOutputStream.(FileOutputStream.java:73)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at [packagename ommitted].db.AssetDatabaseOpenHelper.copyDatabase(AssetDatabaseOpenHelper.java:38)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at [packagename ommitted].db.AssetDatabaseOpenHelper.openDatabase(AssetDatabaseOpenHelper.java:27)
11-08 16:45:37.293: E/AndroidRuntime(12662):    ... 15 more
11-08 16:45:37.293: E/AndroidRuntime(12662): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at libcore.io.Posix.open(Native Method)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
11-08 16:45:37.293: E/AndroidRuntime(12662):    at libcore.io.IoBridge.open(IoBridge.java:400)
11-08 16:45:37.293: E/AndroidRuntime(12662):    ... 19 more

1 个解决方案

#1


2

You should make sure that the database path exists.

您应该确保数据库路径存在。

I assume you are trying to copy the database into a non-existing directory, because the error message is "No such file or directory" on the line where you create the FileOutputStream in copyDatabase().

我假设您正在尝试将数据库复制到一个不存在的目录中,因为在copyDatabase()中创建FileOutputStream的行上,错误消息是“没有这样的文件或目录”。

更多相关文章

  1. Android代码性能优化技巧
  2. Android之SQLite数据库篇
  3. Android公钥私钥及代码详细解读
  4. android OSChina 客户端源代码剖析
  5. 如何设计数据库模型来记录客户的历史活动?
  6. 如何使用adb命令查看android中的数据库
  7. android代码混淆 GSON完满解决
  8. Android开源代码解读の地图照片应用Panoramio的实现详解(六)
  9. 在app引擎端点的启动时执行代码

随机推荐

  1. TableRow 背景问题以及修改对话框标题高
  2. android > WebView > 加载完整网页
  3. Android反编译与防止反编译
  4. 常见UI布局
  5. android studio 2.0安装
  6. android企业实战视频培训班
  7. android官网没法访问issue
  8. android 浏览器问题
  9. android 安卓 开发 图片库获得图片的绝对
  10. Android Studio Emulator: Process finis