在单例中使用FMDB,是更好的FMDatabase或FMDatabaseQueue

时间:2014-12-26 23:49:17

标签: ios objective-c fmdb

我希望使用FMDB在我的应用中创建3个或更多不同的单例以处理不同的商店场景,单例的例子如下:

·H

@interface MyManager : NSObject

+ (id)sharedManager;
- (BOOL)isChecked:(int)id_product;

@end

的.m

    @implementation MyManager

    @synthesize someProperty;

    #pragma mark Singleton Methods

    + (id)sharedManager {
        static MyManager *sharedMyManager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedMyManager = [[self alloc] init];
        });
        return sharedMyManager;
    }

    - (id)init {
      if (self = [super init]) {
          self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:databasePath]; //or FMDatabase
      }
      return self;
    }

- (BOOL)isChecked:(int)id_product
{
    BOOL isChecked = NO;

    [self.databaseQueue inDatabase:^(FMDatabase *db) {

        FMResultSet *product_query = [db executeQuery:@"SELECT isChecked FROM products WHERE id = ?",[NSNumber numberWithInt:id_product]];

        while ([product_query next]) {

            if ([product_query boolForColumn:@"isChecked"] == 1) {
                isChecked = YES;
            } else {
                isChecked = NO;
            }
        }
    }];

    return isChecked;
}

    @end

所以我的问题是,我可以创建3个或更多这样的单例,使用FMDatabaseQueueFMDatabase定义为类的类属性,并且最好使用FMDatabaseQueue还是FMDatabase

1 个答案:

答案 0 :(得分:1)

一些想法:

  1. 理论上,您可以拥有三个不同类别的单例对象,每个对象都有自己的FMDatabase / FMDatabaseQueue实例。

    你是否应该这样做是一个完全不同的问题。有三个,没有一些非常有说服力的论据,表明一些严重的代码味道。

  2. 确保这三个实例中没有一个尝试访问同一个数据库文件,否则您将失去FMDatabaseQueue的全部目的。如果您处理三个不同的数据库文件(即便如此,它看起来像一个奇怪的设计),这三个实例模型只是合理的。

    你说"我认为我只能使用一个单例,使用不同单例的想法只是为了使代码更具可读性,并将操作划分为类型。"

    这绝对不是三个单身人士类的论据。你应该只有一个。

  3. FMDatabaseFMDatabaseQueue而言,后者可让您享受多线程访问,因此我会倾向于此。使用FMDatabase没有明显优势,但不必要地引入了限制。

    FMDatabaseQueue的全部目的是在多个线程访问同一个数据库时管理数据库争用。因此,如果您绝对确定地知道您永远不会从不同的线程访问FMDatabase对象,那么您可以使用FMDatabase

    但为什么要把自己画成这样的角落?只需使用FMDatabaseQueue,然后您就不必担心它。如果你从多个线程中使用它(例如你使用GCD块中的实例,异步方法的完成处理程序等等),它可以在单个线程中使用并且可以避免许多令人头痛的问题。