我正在尝试通过下载将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;
}
答案 0 :(得分:0)
所以仍然不知道原因,但如果我先删除数据库的旧副本(位于DB_PATH + DB_NAME)然后在那里解压缩新副本,问题就解决了。直接复制时我不需要这样做。
所以,这是一个文件覆盖问题......如果有人知道原因,请随时发表评论