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新規作成時にのLog.d("MD5 Sum", digest); 出力が 1 つあり、再起動時に (つまり、DB ファイルが内部ストレージに存在する) の出力が異なるcheck_DBのはなぜですか。Log.d("MD5 Sum", digest);

ノート:

databaseExist(ctx)Android の規則に従って、DB ファイルの存在をチェックします。

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 に答える