如何将db.zip从资产复制到android中的SD卡

时间:2014-06-13 11:24:50

标签: android database sqlite sd-card

我有一个40MB大小的SQLite DB。我使用SQLite资产助手库来复制数据库并使用它。因为APK大小问题我应该压缩我的数据库。 lib工作得很好,但它将DB复制到内部存储器中,40MB大小的DB会导致未来出现问题。 我想将我的数据库复制到SD。

解决方案1:将带有SQLite Asset Helper lib的压缩DB复制到内部存储器中,然后将DB移至SD。

解决方案2:直接将压缩后的DB复制到SD卡中。

所以请帮助我哪一个更好,我怎么做。

1 个答案:

答案 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);
    }
}