【问题标题】:SQLite Database Does Not Exist AndroidSQLite 数据库不存在 Android
【发布时间】:2013-07-08 23:14:44
【问题描述】:

编辑:为了清晰而删除了以前的代码

根据建议,我添加了日志消息以查看我停止的位置。

似乎它正确地调用了checkDatabase(),但没有返回复制数据库。这是我的checkDatabase() 方法:

File dbFile = new File(DB_PATH + DB_NAME);
        if(dbFile.exists()){
            Log.d("True","Returned true");
            return true;

        }else{
            dbFile.getParentFile().mkdirs();
            Log.d("CreatedPath","Made the right directory");
            return false;
        }

在调试日志中,我可以看到我的“已创建路径”消息。所以它已经走得那么远了。

然后它返回 false,应该开始:

public void createDataBase() throws IOException{

        boolean dbExist = checkDatabase();
        if (!dbExist){

            this.getReadableDatabase();

            // Calling this method an empty database will be
            // created into the default system path of 
            // the app so we can overwrite with FirstDB.


            try{

                copyDatabase();

            }catch (IOException e) {
                throw new Error("Error copying database");

            }
        }
    }

但是,我根本没有看到这些日志消息。就像它返回 false 并继续移动一样。

我需要再次拨打createDataBase()吗?

【问题讨论】:

  • 请考虑使用经过测试、调试和支持的SQLiteAssetHelper,而不是以下代码:github.com/jgilfelt/android-sqlite-asset-helper
  • 这不起作用。甚至一点点。
  • 它适用于许多其他人,与您正在使用的代码库相比,很多人都遇到了问题,所有关于它的 StackOverflow 问题都证明了这一点。

标签: java android sqlite


【解决方案1】:

我会试试这个:

首先,更改路径字符串

private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";

接下来,对文件进行相同的检查,但如果目录不存在,则创建目录。无论如何,您必须这样做;这就是 Android 的 SQLite 实现默认保存 DB 的地方。

所以试试这个:

private boolean checkDatabase(){
    File dbFile = new File(DB_PATH + DB_NAME);
    if(dbFile.exists()){
       return true;
    }
    else{
       //This'll create the directories you wanna write to, so you
       //can put the DB in the right spot.
       dbFile.getParentFile().mkdirs();
       return false;
    }
}

无论如何,这只是通过谷歌搜索得到的,而我所知道的是我的头脑。链接在底部。

另外,我有点困惑:

    //YOU NAME THIS myInput:
    InputStream myInput = firstDBContext.getAssets().open(DB_NAME);
    String outFileName = DB_PATH + DB_NAME;
    OutputStream bnOutput = new FileOutputStream(outFileName);
    byte[] buffer = new byte[1024];
    int length; 
    //YOU READ FROM bnInput:
    while ((length = bnInput.read(buffer)) > 0){
        bnOutput.write(buffer, 0, length);
    }

也许我在这里遗漏了一些东西,但你不是从两个不同的 InputStreams 中读取的吗?我也不明白你为什么在createDatabase()中调用这个函数:

    this.getReadableDatabase();

据我所知,该函数将调用 onCreate,它调用 createDatabase,如果 checkDatabase() 返回 false,它将再次调用 onCreate。我用谷歌搜索的链接:

Java's createNewFile() - will it also create directories?

https://stackoverflow.com/a/9865386/2015759

http://docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs%28%29

Create intermediate folders if one doesn't exist

祝你好运。

【讨论】:

  • 感谢您的解释。您的困惑是正确的,这是先前版本的尝试中的错字。我倾向于模糊地命名我的所有变量,并试图在这里更新以使其对读者有意义。我做了你建议的改变,结果还是一样。无法打开数据库。在创建之前有些东西正在停止,因为我检查了文件资源管理器并且该目录不存在。如果是这种情况,它甚至没有使用createDataBase() 方法,因为其中的第一个调用是checkDatabase();,它将创建目录并返回false。想法?
  • 在您认为它崩溃的地方添加对 logcat 的调用。放: Log.d("MESSAGE_TAG_HERE", "MESSAGE_HERE");例如,在 checkDatabase 中,在 if(db.exists()) 条件中放入 Log.d 代码,并显示“db 存在!”的消息。等等。此外,在您发布的 logcat 中,它说您的文件 DBSQLiteHelper 的第 100 行有一个错误。它在 openDatabase 函数中。也许你会在那里找到什么,我不知道。
  • 好主意。我快要发疯了,我已经尝试了 3 天,今天花了几个小时试图找到解决方案。
  • 我现在在想,如何实例化对 DBSQLiteHelper 的调用?我的应用程序在我的第一个活动中正确打开,当我进入第二个活动(尝试使用数据库)时它失败了。几乎就好像永远不会调用数据库创建。
  • 搞定了。这是我调用 DBSQLiteHelper 方法的方式。我从中间开始,而不是从顶部开始。本质上,我在创建数据库之前调用了checkDataBase()。它向我用来调用它的方法返回 false,这一切都很好,除了在 false 返回之后我从未真正创建数据库。接受这个答案以获得添加 logcat 调用的想法。我什至不知道你能做到这一点,但它完全清理了我的调试。字。
【解决方案2】:

从您的设备中卸载该应用程序并重试,但将/databases/ 添加到您的DB_PATH

private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";

据我所知,它应该一直存在,我在您的 createDatabase 方法上看不到它。

稍后尝试通过 sqlite3 访问以检查它是否正确创建。

According to docs

要使用 sqlite3,请在模拟器实例上输入远程 shell,如上所述,然后使用 sqlite3 命令调用该工具。或者,在调用 sqlite3 时,您可以指定要探索的数据库的完整路径。模拟器/设备实例将 SQLite3 数据库存储在文件夹 /data/data//databases/ 中。

这是一个例子:

adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.mydbapp/databases/FirstDB.db`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2011-03-09
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多