Я только что реализовал SQLCipher в своем приложении для шифрования одной довольно простой базы данных. Я тщательно следовал всем инструкциям по настройке этого руководства, и проект строится, и приложение успешно работает. Однако, когда я использую их пример кода для шифрования базы данных, мой пароль почему-то неверен, и теперь я не могу открыть свою базу данных. Вот код:
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent: @"dict.sqlite"];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
const char* key = [@"BIGSecret" UTF8String];
sqlite3_key(database, key, strlen(key));
if (sqlite3_exec(database, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
// password is correct, or, database has been initialized
NSLog(@"Correct Password :)");
}
else {
// incorrect password!
NSLog(@"Incorrect Password :(");
}
}
else {
sqlite3_close(database);
NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
}
}
sqlite3 *database;
объявлено в моем интерфейсе. Мое приложение падает на этой линии:
if (sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) != SQLITE_OK) {
NSAssert1(NO, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
}
Все отлично работало без шифрования, поэтому с остальным моим кодом проблем нет. Консоль печатает «Неверный пароль :(» до сбоя. Журнал сбоя: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error: failed to prepare statement with message 'file is encrypted or is not a database'.'
Очевидно, что с паролем есть проблема. Любая помощь?
Спасибо.