2011-12-21 78 views
1

當試圖將數據複製到使用SQLCipher從普通數據庫(source)加密的附加數據庫(db)中時,我得到「無此表」異常。Android,SQLite:在附加數據庫中沒有這樣的表異常

StringBuilder attachDatabase = new StringBuilder(); 
    attachDatabase.append("ATTACH DATABASE '").append(this.db.getPath()). 
        append("' as ").append(NEW_DB_ALIAS). 
        append(" KEY '").append("123").append("';"); 
    source.execSQL(attachDatabase.toString()); 

    StringBuilder copyTable = new StringBuilder(); 
    String table = "t1"; 
    copyTable.append("INSERT INTO ").append(NEW_DB_ALIAS).append(".").append(table). 
       append(" SELECT * FROM ").append(table).append(";"); 
    db.execSQL(copyTable.toString()); 

加密數據庫被創建並且具有與未加密數據庫相同的方案。可能是什麼問題呢?

+0

你有沒有想過這個? – Phil 2014-06-05 04:00:56

+0

編號必須以某種方式解決它 - 不記得詳細信息 – Asahi 2014-06-05 06:29:08

回答

0

您可以驗證您正在使用的Android版SQLCipher的版本嗎?我們最近發佈了1.0個庫,你可以在這裏找到:https://github.com/downloads/guardianproject/android-database-sqlcipher/SQLCipherForAndroid-SDK-0.0.6-FINAL.zip

我剛纔遇到了以下場景,其中新的數據庫文件在執行前並不存在,並且工作正常。你可以嘗試這樣做,而不必先用schema創建新的數據庫:

String newKey = "foo"; 
    File newDatabasePath = getDatabasePath("new.db"); 
    String attachCommand = "ATTACH DATABASE ? as encrypted KEY ?"; 
    String createCommand = "create table encrypted.t1(a,b)"; 
    String insertCommand = "insert into encrypted.t1 SELECT * from t1"; 
    String detachCommand = "DETACH DATABASE encrypted"; 
    encryptedDatabase.execSQL(attachCommand, new Object[]{newDatabasePath.getAbsolutePath(), newKey}); 
    encryptedDatabase.execSQL(createCommand); 
    encryptedDatabase.execSQL(insertCommand); 
    encryptedDatabase.execSQL(detachCommand); 
+0

我正在使用SQLCipher for Android v1(0.0.6-RC1) – Asahi 2011-12-22 21:56:03

+0

您是否可以在兩個數據庫上使用SQLite SQLCipher構建的sqlite3執行「.schema」命令?這將有助於驗證兩個模式是否相同。 – 2011-12-22 22:40:14

+0

如果您希望可以通過代碼運行以下驗證(用您的值替換NEW_DB_ALIAS): select * from sqlite_master; select * from NEW_DB_ALIAS.sqlite_master; – 2011-12-22 22:42:57

相關問題