(добавив это в качестве ответа, поскольку было бы довольно громоздко поместить его в качестве комментария)
Я настоятельно рекомендую использовать FMDB для взаимодействия с базой данных.Это обертка вокруг SQLite C API, которая позволяет очень легко взаимодействовать с базой данных.Ваш код можно изменить, чтобы использовать его с минимальным вмешательством.Вот как это будет выглядеть:
- (void)initializeDatabaseWithFilter:(NSString *)filter
{
self.frister = [NSMutableArray array];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Frister.sqlite"];
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) {
NSString *sql = [NSString stringWithFormat:@"SELECT fristKey FROM frister WHERE %@ = 1", filter];
FMResultSet *results = [db executeQuery:sql];
while([results next]) {
int primaryKey = [results intForColumn:@"fristKey"];
Frist *td = [[Frist alloc] initWithOwnerID:primaryKey database:db];
[[self frister] addObject:td];
[td release];
}
[db close];
}
}
Разве это не выглядит TON более читабельным?Довольно легко увидеть, что вы выполняете запрос, просматриваете результаты и вытягиваете «fristKey», чтобы создать объект «Frist».Вам не нужно беспокоиться о sqlite3_open
, подготовке операторов, привязке параметров или завершении операторов.
Другая вещь, которую вам нужно изменить, - это Frist
объект: он должен принять FMDatabase*
как «база данных» вместо sqlite3*
.Вы также можете рассмотреть возможность открытия базы данных один раз, а затем оставить ее открытой до тех пор, пока она вам больше не понадобится (в противном случае вам придется -open
делать это каждый раз, когда вы захотите выполнить что-то; это полностью ваше дело).
Чтобы включить FMDB в ваше приложение, загрузите код с Github, а затем скопируйте файлы FMDatabase, FMDatabaseAdditions и FMResultSet (все 6) в свое приложение и #import
их, где вам нужно будет взаимодействовать сбаза данных.Вам все равно нужно будет ссылаться на sqlite3.dylib.
Просто убедитесь, что вы соблюдаете (очень разрешительную) лицензию .