Как мне сделать базу данных FMDB одноэлементной

#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/… Это переменная экземпляра, которую класс может совместно использовать.