我有一个40MB大小的SQLite DB。我使用SQLite资产助手库来复制数据库并使用它。因为APK大小问题我应该压缩我的数据库。 lib工作得很好,但它将DB复制到内部存储器中,40MB大小的DB会导致未来出现问题。 我想将我的数据库复制到SD。
解决方案1:将带有SQLite Asset Helper lib的压缩DB复制到内部存储器中,然后将DB移至SD。
解决方案2:直接将压缩后的DB复制到SD卡中。
所以请帮助我哪一个更好,我怎么做。
答案 0 :(得分:1)
我的数据库很小,所以我不压缩它,但我压缩了一些图像(主要是捆绑它们)并将它们直接解压缩到一个位置。您应该能够为数据库zip文件调整以下代码。
我创建了一个在我的启动画面中触发的AsyncTask,它将保持启动画面打开,直到副本完成。
复制过程非常简单:
protected Void doInBackground(String... params) {
final File dataBaseFile = new File(mDestinationFile);
if (!dataBaseFile.exists()) {
try {
copyFromAssetsToSdcard();
FileUtils.unzip(mContext.getAssets().open("images.zip"), Constants.IMAGE_CACHE_PATH + "/");
} catch (IOException ioe) {
Log.e(LOG_TAG, "Database can not be copied", ioe);
}
} else {
Log.w(LOG_TAG, "Destination database already exists");
}
return null;
}
private void copyFromAssetsToSdcard() throws IOException {
final BufferedInputStream inputStream = new BufferedInputStream(mContext.getAssets().open(mSourceFile));
final OutputStream outputStream = new FileOutputStream(mTmpDestinationFile);
copyStream(inputStream, outputStream);
outputStream.flush();
outputStream.close();
inputStream.close();
File tmpFile = new File(mTmpDestinationFile);
if (tmpFile.renameTo(new File(mDestinationFile))) {
Log.w(LOG_TAG, "Database file successfully copied!");
} else {
Log.w(LOG_TAG, "Database file couldn't be renamed!");
}
}
我的FileUtils.unzip方法只需解压缩到指定位置:
public static void unzip(InputStream zipInput, String location) throws IOException {
try {
File f = new File(location);
if (!f.isDirectory()) {
f.mkdirs();
}
ZipInputStream zin = new ZipInputStream(zipInput);
try {
ZipEntry ze = null;
final byte[] buffer = new byte[BUFFER_SIZE];
while ((ze = zin.getNextEntry()) != null) {
String path = location + ze.getName();
if (ze.isDirectory()) {
File unzipFile = new File(path);
if (!unzipFile.isDirectory()) {
unzipFile.mkdirs();
}
} else {
FileOutputStream fout = new FileOutputStream(path, false);
try {
int length = zin.read(buffer);
while (length > 0) {
fout.write(buffer, 0, length);
length = zin.read(buffer);
}
zin.closeEntry();
} finally {
fout.close();
}
}
}
} finally {
zin.close();
}
} catch (Exception e) {
Log.e(LOG_TAG, "Unzip exception", e);
}
}