Iphone / ipad: Я получил сообщение «файл зашифрован или не является базой данных» при использовании ключа pragma в sqlite cipher? - PullRequest
1 голос
/ 01 декабря 2011

Я использую ios5.0 и Xcode 4.2 и sqlite 3. Я могу создать базу данных и таблицу, а также я могу читать и писать в таблице.

Но если я использую sqlcipher, то я получилошибка "файл зашифрован или не является базой данных".Пожалуйста, объясните мне, почему я получаю такую ​​ошибку?Я приложил код с этим.Пожалуйста, найдите его .. и спасибо заранее.

-(void) readFromDatabase {
  // Setup the database object
  sqlite3 *database;
  devicesArray = [[NSMutableArray alloc] init];
  // Open the database from the users filessytem
  if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {

        // Setup the SQL Statement and compile it for faster access
        const char *sqlStatement = "select * from patient;";
        sqlite3_stmt *compiledStatement;
     //   const char* key = [@"test" UTF8String];
     //   NSLog(@"Length %lu" , strlen(key));
     //  sqlite3_key(database, key, strlen(key));

         sqlite3_exec(database, "PRAGMA KEY='test123';", NULL, NULL, NULL);
        printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) );

        int returnCode = sqlite3_exec(database, (const char*) "SELECT count(*) FROM patient;", NULL, NULL, NULL);
         printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) ); 
         NSLog(@"%d",returnCode);    // the return code is 26 and getting the error


        if (sqlite3_exec(database, (const char*) "SELECT count(*) FROM patient;", NULL, NULL, NULL) == SQLITE_OK) {
            NSLog(@"Success");

        } else {
             NSLog(@"Failure");

        }

         returnCode = sqlite3_prepare_v2( database, sqlStatement, -1, &compiledStatement, nil);
        printf( "could not prepare statemnt1: %s\n", sqlite3_errmsg(database) ); 
        NSLog(@"%d",returnCode); //the return code is 26 and getting the error


        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            // Loop through the results and add them to the feeds array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                // Read the data from the result row
                NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                NSString *aDescription = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                NSString *aImageUrl = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];


                devices *d = [[devices alloc] initWithName:aName description:aDescription url:aImageUrl];

                [devicesArray addObject:d];

                [devices release];
            }
        }
        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);

    }
    sqlite3_close(database);

}

1 Ответ

0 голосов
/ 20 января 2012

Ваш код, похоже, предполагает, что база данных уже существует.Вы пытаетесь открыть существующую незашифрованную базу данных, а затем зашифровать ее с помощью SQLCipher?Если это так, то, что вы делаете, не сработает.

Функция sqlite3_key не шифрует существующую базу данных.Если вы хотите зашифровать существующую базу данных, вам нужно либо присоединить новую зашифрованную базу данных и переместить данные между ними, как описано здесь:

http://zetetic.net/blog/2009/12/29/how-to-encrypt-a-plaintext-sqlite-database-to-use-sqlcipher/

Или, используя SQLCipher2 вы можете использовать sqlcipher_export, который обеспечивает простой способ перемещения данных между базами данных.:

http://groups.google.com/group/sqlcipher/msg/76d5b03426419761

...