Java Android中解压缩的数据库不可读
我试图通过下载SQLite数据库,然后将其解压缩到正确的位置,将其传输到应用程序中。解压时,我成功地传输了数据库。我得到的错误是,它找不到我查询的任何表。我还成功地解压和读取了普通文本文件 DB有希伯来语和英语,但这以前没有引起问题。双语数据库未压缩时已成功复制,双语文本已成功解压缩并读取。尽管如此,仍有可能存在编码问题。这对我来说似乎很奇怪,因为正如你在下面的代码中看到的,我只是直接复制字节 -编辑- 假设预压缩的数据库名为test1.db。我将其压缩,放入应用程序中,解压缩并调用test2.db。当我在这两者上运行diff命令时,没有任何区别。所以安卓读取文件的方式肯定存在技术问题,或者安卓电脑上不存在的编码问题 我不喜欢做代码转储,但我会发布我的copyDatabase()函数(它可以工作)。这就是我以前在解压缩的DB文件上运行它时使用的方法。我把它放在这里作为比较。现在我尝试使用unzipDatabase()函数(它不起作用),并在压缩的DB文件上使用它。后一个函数是从Java Android中解压缩的数据库不可读,java,android,sqlite,zip,Java,Android,Sqlite,Zip,我试图通过下载SQLite数据库,然后将其解压缩到正确的位置,将其传输到应用程序中。解压时,我成功地传输了数据库。我得到的错误是,它找不到我查询的任何表。我还成功地解压和读取了普通文本文件 DB有希伯来语和英语,但这以前没有引起问题。双语数据库未压缩时已成功复制,双语文本已成功解压缩并读取。尽管如此,仍有可能存在编码问题。这对我来说似乎很奇怪,因为正如你在下面的代码中看到的,我只是直接复制字节 -编辑- 假设预压缩的数据库名为test1.db。我将其压缩,放入应用程序中,解压缩并调用test2.
所以仍然不知道为什么,但是如果我先删除数据库的旧副本(位于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;
}