3

サイトのチュートリアルとして SQLCipher を構成しました...プロジェクトをコンパイルして実行できます。しかし、ステートメントを実行しようとすると、sqlite3_exec は SQLITE_NOTADB を返します。

以下のコード スニペットを見つけてください。

=================

NSString *dbPath = [self getDBPath];
BOOL success = [fileManager fileExistsAtPath:dbPath];           
if(success) {
    int sql_results = sqlite3_open([dbPath UTF8String], &SQLDB);            
    const char* key = [@"BIGSecret" UTF8String];
    sqlite3_key(SQLDB, key, strlen(key));
    if (sql_results == SQLITE_OK) {
        NSString *sql;
        const char *update_sql; 
        sql = [NSString stringWithFormat:@"DROP table %@",tablename];
        update_sql = [sql cStringUsingEncoding:NSUTF8StringEncoding];
        if(sqlite3_exec(SQLDB, update_sql, nil, nil, nil) == SQLITE_OK) { 
            NSLog(@"Good to go %@ dropped",tablename);
        }
        else {      
            NSLog(@"Bad Delete Cat SQL: %s -- %d", update_sql,sql_results); 
            NSLog(@"error code %i", sql_results);
        }

私が間違っていた問題を取得できません....

ありがとう、

ベン

4

1 に答える 1

2

メーリング リストからの相互投稿:

あなたのコードでは、データベース ファイルが存在する場合にのみ sqlite3_open へのブロックを入力していることに気付きました。たまたま、このコードを使用して SQLCipher を使用して既存の標準 SQLite データベースを暗号化しようとしていますか? その場合、sqlite3_key の呼び出しはそのようには機能しません。代わりに、標準の SQLite データベースを開き、新しい暗号化されたデータベースを接続してから、2 つの間でデータをエクスポートする必要があります。この手順の詳細については、次を参照してください。

http://sqlcipher.net/sqlcipher-api/#sqlcipher_export

暗号化されたデータベースを扱う場合は、それを使用する前に最初の操作として sqlite3_key を呼び出すことができます。

于 2012-09-27T04:04:37.833 に答える