0

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

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

似乎它正确地调用了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()吗?

4

2 回答 2

2

我会试试这个:

首先,更改该路径字符串

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 的 createNewFile() - 它还会创建目录吗?

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

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

如果中间文件夹不存在,则创建中间文件夹

祝你好运。

于 2013-07-10T21:31:09.857 回答
1

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

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

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

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

根据文档

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

这是一个例子:

adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.mydbapp/databases/FirstDB.db`
于 2013-07-10T20:57:51.693 回答