2011-12-21 2 views
1

Я получаю исключение «нет такой таблицы» при попытке скопировать данные во вложенную базу данных (db), зашифрованную SQLCipher из простой базы данных (source).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

+0

Нет. Пришлось обходить это как-то - не помню деталей – Asahi

ответ

0

Не могли бы вы проверить, какую версию SQLCipher для Android вы используете? Недавно мы выпустили 1.0 из библиотек, которые вы можете получить здесь: https://github.com/downloads/guardianproject/android-database-sqlcipher/SQLCipherForAndroid-SDK-0.0.6-FINAL.zip

Я просто просмотрел следующую ситуацию, когда новый файл базы данных не существует до его выполнения, и он работает хорошо. Можете ли вы попробовать это сделать, не создавая новую базу данных с первой схемой:

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 для Android v1 (0.0.6-RC1) – Asahi

+0

Могли бы вы выполнить команду «.schema», используя sqlite3 SQLCipher-сборки SQLite в обеих базах данных? Это поможет проверить, что две схемы одинаковы. –

+0

Если вы хотите, чтобы вы также проверили следующий код, замените NEW_DB_ALIAS на ваше значение: выберите * из sqlite_master; выберите * из NEW_DB_ALIAS.sqlite_master; –

Смежные вопросы