加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 如何使FMDB的数据库成为单例

发布时间:2020-12-16 06:56:15 所属栏目:百科 来源:网络整理
导读:我一直在使用SQLite一段时间,并决定去FMDB.我需要让它成为一个单身人士.这是我下面的代码;我需要更改FMDB才能访问单例d / b? #pragma mark Singleton Methods+ (SQLiteDB *) sharedSQLiteDB { if(!sharedSQLiteDB) { sharedSQLiteDB = [[SQLiteDB alloc] in
我一直在使用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;
}

这是我用来使用FMDB初始化d / b的代码:

//-----------------------    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_type TEXT,gps_loc TEXT)"];

            if(errmsg != nil)
                NSLog(@"error: %s",errmsg);  //  DEBUGGING ONLY!  (REMOVE when done!)
        }
        return;
    }

解决方法

您的SQLiteDB类需要维护对FMDatabase的引用,以便您的其他方法能够共享同一个数据库.

@interface SQLiteDB : NSObject //Or whatever base class
{
    FMDatabase *_database;
}

@end

//implementation

- (void) openCreateDB  {
   ...
   if(!fileExists)  {
      _database = [[FMDatabase databaseWithPath: databasePath] retain];
   ...
   }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读