我正在使用带有 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;
请建议我该如何解决这个问题?