Android中的解压缩DB无法读取

时间:2015-01-07 09:53:59

标签: java android sqlite zip

我正在尝试通过下载将SQLite数据库转移到应用程序,然后将其解压缩到正确的位置。在解压缩时我成功地传输了数据库。我得到的错误是它找不到我查询的任何表。我也成功解压缩和阅读普通文本文件。

DB有希伯来语和英语,但之前没有引起过问题。双语DB在未压缩且双语文本已成功解压缩和读取时成功复制。仍然存在编码问题的可能性。这对我来说似乎很奇怪,因为你可以在下面的代码中看到,我只是直接复制字节。

- 编辑 -

假设prezipped db叫做test1.db。我将其压缩,将其放入应用程序,解压缩并调用test2.db。当我在这两个上运行diff命令时,没有任何区别。因此,android在Android上读取文件/或编码问题的方式一定存在技术问题吗?

我讨厌做代码转储,但我会发布我的copyDatabase()函数(可以正常工作)。这就是我之前在解压缩的DB文件上运行它的原因。我把它作为比较。现在我正在尝试使用unzipDatabase()函数(它不起作用),并在压缩的DB文件上使用它。后一个函数是从How to unzip files programmatically in Android?

复制的
private void copyDatabase() throws IOException{
    String DB_NAME = "test.db";
    String DB_PATH = "/data/data/org.myapp.myappname/databases/";
    //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

private boolean unzipDatabase(String path)
{     
    String DB_NAME = "test.zip";
    InputStream is;
    ZipInputStream zis;
    try 
    {
        String filename;
        is = myContext.getAssets().open(DB_NAME);
        zis = new ZipInputStream(is);          
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) 
        {
            // write to a file
            filename = ze.getName();

            // Need to create directories if not exists, or
            // it will generate an Exception...
            if (ze.isDirectory()) {
                Log.d("yo",path + filename);
                File fmd = new File(path + filename);
                fmd.mkdirs();
                continue;
            }

            OutputStream fout = new FileOutputStream(path + filename);

            // reading and writing zip
            while ((count = zis.read(buffer)) != -1) 
            {
                fout.write(buffer, 0, count);             
            }

            fout.flush();
            fout.close();               
            zis.closeEntry();
        }

        zis.close();
    } 
    catch(IOException e)
    {
        e.printStackTrace();
        return false;
    }

    return true;
}

1 个答案:

答案 0 :(得分:0)

所以仍然不知道原因,但如果我先删除数据库的旧副本(位于DB_PATH + DB_NAME)然后在那里解压缩新副本,问题就解决了。直接复制时我不需要这样做。

所以,这是一个文件覆盖问题......如果有人知道原因,请随时发表评论