0

我正在使用带有 SQLCipher 的 DBFlow。我正在尝试在 Android 中使用 SQLCipher 加密已经存在的 SQLite 数据库(使用 DBFlow)。

我使用以下代码加密数据库:

private void encryptDB() {
        SQLiteDatabase.loadLibs(this);
        String password = "test123";
        String LEGACY_DATABASE_NAME = "legacy.db";
        String NEW_DATABASE_NAME = "new_crypt.db";
        File newDBFile = getDatabasePath(NEW_DATABASE_NAME);
        File legacyFile = getDatabasePath(LEGACY_DATABASE_NAME);
        if (!newDBFile.exists() && legacyFile.exists()) {
            SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(legacyFile, "", null);
            db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';", newDBFile.getAbsolutePath(), password));
            db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
            db.rawExecSQL("DETACH DATABASE encrypted;");
            db.close();
            db = SQLiteDatabase.openDatabase(newDBFile.getAbsolutePath(), password, null, SQLiteDatabase.OPEN_READWRITE);
            db.close();
            legacyFile.delete();
            newDBFile.renameTo(legacyFile);
        }
    }

数据库加密得很好,但是当我尝试编写任何操作时:

Place place = new Place();
place.setName("Test");
place.save();

数据库型号:

@Table(database = DatabaseManager.class)
public class Place extends BaseModel {
  @Column
  String name;
  // set and get methods goes here
}

然后得到以下异常:

io.reactivex.exceptions.UndeliverableException:android.database.sqlite.SQLiteReadOnlyDatabaseException:尝试写入只读数据库(代码 1032 SQLITE_READONLY_DBMOVED[1032])

我在这里找到了类似的帖子,但没有找到任何解决方案。

另外,我发现是用 SQLCipher 加密 DBFlow 数据库并实现它。然后,如果我将它作为新应用程序安装它就可以工作,但是当我将此应用程序安装在没有加密数据库的旧应用程序之上时,它就会失败。

net.sqlcipher.database.SQLiteException: file is not a database: ,编译时:select count(*) from sqlite_master;

请建议我该如何解决这个问题?

4

0 回答 0