#objective-c #sqlite #fmdb
#objective-c #sqlite #fmdb
Вопрос:
Я уже некоторое время использую SQLite и решил перейти на FMDB. Мне нужно сделать ее одноэлементной. Вот мой код ниже; что мне нужно изменить, чтобы FMDB получила доступ к одноэлементному d / b?
#pragma mark Singleton Methods
(SQLiteDB *) sharedSQLiteDB {
if(!sharedSQLiteDB) {
sharedSQLiteDB = [[SQLiteDB alloc] init];
[sharedSQLiteDB openCreateDB]; // check to see if d/b exists
}
return sharedSQLiteDB;
}
и это код, который я использую для инициализации d / b с использованием FMDB:
//----------------------- checkIfDatabaseExists -----------------|
- (void) openCreateDB {
searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // Get the path to the database file
documentPath = [searchPaths objectAtIndex:0];
databasePath = [documentPath stringByAppendingPathComponent:@"ppcipher.s3db"];
cDatabasePath = [databasePath cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"d/b path: /%@", databasePath);
NSString *sqlCommand = @"CREATE TABLE CardData (card_id TEXT PRIMARY KEY NOT NULL, card_name TEXT NOT NULL, "
@"card_type TEXT, code_val TEXT, create_date TEXT DEFAULT CURRENT_DATE, user_notes TEXT, gps_loc TEXT)";
char * errmsg = nil;
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:databasePath error:NULL]; // <------------ delete d/b TESTING ONLY!
BOOL fileExists = [fileManager fileExistsAtPath:databasePath];
if(!fileExists) {
FMDatabase* db = [FMDatabase databaseWithPath: databasePath];
if (![db open]) {
NSLog(@"Could not open/create database");
}
[db executeUpdate:@"CREATE TABLE CardData (card_id TEXT PRIMARY KEY NOT NULL, card_name TEXT NOT NULL, "
@"card_type TEXT, code_val TEXT, create_date TEXT DEFAULT CURRENT_DATE, user_notes TEXT, gps_loc TEXT)"];
if(errmsg != nil)
NSLog(@"error: %s", errmsg); // DEBUGGING ONLY! (REMOVE when done!)
}
return;
}
Комментарии:
1. У разработчика FMDB есть сообщение в блоге об синглетонах funwithobjc.tumblr.com/post/3478903440/how-i-do-my-singletons то же самое относится и к книге Мэтта Галлахера «Какао с любовью» cocoawithlove.com/2008/11 /…
2. Я знаю, как создавать синглтоны, когда начинаю с нуля. Поскольку FMDB уже написана, мне интересно, «что» я должен изменить, чтобы заставить ее работать. (Должен ли я изменить свой код SQLite3 в первом примере или что-то в существующем коде FMDB)?
3. Это выглядит так же просто, как получить к ней доступ только к базе данных в вашем приложении через sharedSQLiteDB. Этого недостаточно?
4. Я тоже так думал, но потом увидел это и не знал, что с этим делать… FMDatabase* db = [FMDatabase databaseWithPath: DatabasePath];
5. Я опубликовал ответ, обязательно отпустите
_database
в dealloc, а также посмотрите некоторые примеры одноэлементных элементов онлайн, чтобы убедиться, что ваш одноэлементный элемент работает так, как вы хотите (потокобезопасность, управление памятью)
Ответ №1:
Вашему классу SQLiteDB потребуется поддерживать ссылку на вашу базу данных FMDatabase, чтобы ваши дополнительные методы могли совместно использовать ту же базу данных.
@interface SQLiteDB : NSObject //Or whatever base class
{
FMDatabase *_database;
}
@end
//implementation
- (void) openCreateDB {
...
if(!fileExists) {
_database = [[FMDatabase databaseWithPath: databasePath] retain];
...
}
}
Комментарии:
1. Спасибо… не могли бы вы объяснить мне, как _database в интерфейсе вызывает использование одного d / b при открытии SQLiteDB? или укажите мне документ, который объяснил бы это?
2. Проверьте эту ссылку developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… Это переменная экземпляра, которую класс может совместно использовать.