1

语境

我正在将一个 sqlite db 文件从资产中复制到内部存储中。该文件可以正常打开,但我想要一个额外的安全层。当文件被复制出来时,它没有完成的可能性很小。我决定支持校验和技术:特别是MessageDigest Java。所以这里是代码:

    public ZipCode(Context ctx) {
    this.ctx = ctx;
    if (!databaseExist(ctx)) {
        Log.d("ZipCode", "DB DNE");
        inflate_db(ctx);
        check_DB(ctx);
    } else {
        Log.d("ZipCode", "DB Exsits");
        check_DB(ctx);
    }

}
private static void inflate_db(Context ctx) {
        byte[] buffer = new byte[2048];
        int length;
        AssetManager am = ctx.getAssets();
        try {
            BufferedInputStream is = new BufferedInputStream(
                    am.open(ZIPCODE_SQLITE_FAUX_FILE));
            GZIPInputStream zis = new GZIPInputStream(is);
            File dbfile = ctx.getDatabasePath(ZIPCODE_SQLITE);
            FileOutputStream out = new FileOutputStream(dbfile);
            while ((length = zis.read(buffer, 0, buffer.length)) > 0) {
                out.write(buffer, 0, length);
            }
            out.flush();
            out.close();
            zis.close();
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("ERROR", e.getMessage());
        }
    }

private static void check_DB(Context ctx) {
        File dbfile = ctx.getDatabasePath(ZIPCODE_SQLITE);
        FileInputStream fis;
        MessageDigest digester;
        byte[] bytes = new byte[8192];
        int byteCount;
        try {
            digester = MessageDigest.getInstance("MD5");
            fis = new FileInputStream(dbfile);
            while ((byteCount = fis.read(bytes)) > 0) {
                digester.update(bytes, 0, byteCount);
            }
            String digest = Base64.encodeBytes(digester.digest());
            Log.d("MD5 Sum", digest);
            fis.close();
            return;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        }
    }

现在的问题

为什么在新创建时check_DB'sLog.d("MD5 Sum", digest); 有一个输出并在重新启动时说(即 DB 文件存在于内部存储中)check_DB'sLog.d("MD5 Sum", digest);有不同的输出。

笔记:

databaseExist(ctx)根据 Android 约定检查数据库文件是否存在。

private static boolean databaseExist(Context ctx) {
    File dbFile = ctx.getDatabasePath(ZIPCODE_SQLITE);
    return dbFile.exists();
}
4

1 回答 1

0

你为什么不计算你的资产文件(在你的项目目录中)的 MD5 来找出哪个 MD5 是对的,哪个是错的?那么它会更容易找到问题部分。

另外,我建议根据参考手册(byteCount = fis.read(bytes)) > 0替换为。(byteCount = fis.read(bytes)) != -1FileInputStream

于 2012-11-11T01:40:09.283 回答