在 Xcode 中,我试图让 FMDB 使用 SQLCipher 来加密数据库。在我的项目中,我已经有一个 SQLCipher 的编译版本,我已经证明它可以通过 sqlite3 调用工作。我有一个单元测试,它创建数据库和 1 个表,然后插入一行。除了数据库仍未加密外,一切都可以使用 FMDB 进行。

-(id)initWithDatabaseFilename:(NSString*)filename{
NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
                          stringByAppendingPathComponent: filename];

self.databasePath = databasePath;
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:databasePath]) {
    database = [FMDatabase databaseWithPath:databasePath];
    [database setLogsErrors:YES];
    [database setTraceExecution:NO];
    BOOL keyCheck = [database setKey:@"B!GSecret"];
    NSLog(@"Database is encrypted: %d",keyCheck);
    NSLog(@"database created");
} else {
    NSLog(@"Didnt need to create database");
}
   [self createTable];

return self;

}
-(void)createTable{

BOOL tableExists = [self.database tableExists:kTASKTableName];

if(!tableExists){
    [database open];
    [database executeUpdate:@"CREATE TABLE TEST(TEST_PK integer primary key autoincrement, TITLE text, OTHERTITLE text, TESTVAL text, COMPLETED integer, CREATION_DATE double)"];

    [database close];
}

}
-(BOOL) addTasks:(NSArray*) tasks{
BOOL insertSuccess = NO;

if([self.databasePath isEqualToString:@""]){
    NSLog(@"Database has not yet been initialized");
}
[database open];
for(TESTOBJ *to in tasks){


    [database executeUpdate:@"insert into TEST(TITLE, OTHERTITLE, TESTVAL) VALUES (?,?,?)",
     to.title,to.otherTitle,to.testVal,nil];
}
[database close];

return insertSuccess;

}

最佳答案

通过添加对问题进​​行排序

[database setKey:@"B!GSecret"];

在每个数据库打开语句之后。

关于ios - FMDB 和 SQLCipher 未加密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14649814/

10-11 14:48