SQLite数据库不存在Android

时间:2013-07-10 20:47:04

标签: java android sqlite

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

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

它似乎正在向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()

2 个答案:

答案 0 :(得分:2)

我试试这个:

首先,更改该路径字符串

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

接下来,对文件执行相同的检查,但如果目录不存在则创建该目录。无论如何你必须;这是Android的SQLite实现默认保存数据库的地方。

所以试试这个:

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);
    }

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

    this.getReadableDatabase();

该函数将调用onCreate,它调用createDatabase,如果checkDatabase()返回false,它将再次调用onCreate。链接到我用Google搜索的内容:

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

祝你好运。

答案 1 :(得分:1)

从您的设备卸载该应用,然后重试,但将/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 /<文件夹中package_name> / databases /

以下是一个例子:

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