Java Android中解压缩的数据库不可读

Java Android中解压缩的数据库不可读,java,android,sqlite,zip,Java,Android,Sqlite,Zip,我试图通过下载SQLite数据库,然后将其解压缩到正确的位置,将其传输到应用程序中。解压时,我成功地传输了数据库。我得到的错误是,它找不到我查询的任何表。我还成功地解压和读取了普通文本文件 DB有希伯来语和英语,但这以前没有引起问题。双语数据库未压缩时已成功复制,双语文本已成功解压缩并读取。尽管如此,仍有可能存在编码问题。这对我来说似乎很奇怪,因为正如你在下面的代码中看到的,我只是直接复制字节 -编辑- 假设预压缩的数据库名为test1.db。我将其压缩,放入应用程序中,解压缩并调用test2.

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

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

-编辑- 假设预压缩的数据库名为test1.db。我将其压缩,放入应用程序中,解压缩并调用test2.db。当我在这两者上运行diff命令时,没有任何区别。所以安卓读取文件的方式肯定存在技术问题,或者安卓电脑上不存在的编码问题

我不喜欢做代码转储,但我会发布我的copyDatabase()函数(它可以工作)。这就是我以前在解压缩的DB文件上运行它时使用的方法。我把它放在这里作为比较。现在我尝试使用unzipDatabase()函数(它不起作用),并在压缩的DB文件上使用它。后一个函数是从


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


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

是的,我再次能够在解压时复制和读取数据库(在windows中)。但是当我在android手机上解压它时,它找不到表,这向我表明整个文件可能没有被正确复制
copyDatabase()
方法是不必要的(浪费时间),因为您可以使用
unzipDatabase()
方法直接将数据库解压到正确的路径中(只需添加一个带有目标路径的字符串参数)。也不要硬编码dByPATH…使用一些像AsStSDBHelver之类的库……如果DB在设备上是只读的,你可以考虑使用某种同步(服务器的一种方式很容易实现,两种方式是A**中的疼痛)。以HTTP+JOSN为媒介不确定这些建议是什么,但我很乐意接受它们(尽管它们与这个问题无关)。你能在评论中发布一些你所指内容的链接吗?db是只读的。更新是通过下载一个全新的db并重写来完成的
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;
}