0

我的 iphone 应用程序有一个单一的 sqlite 数据库,可以由许多不同的模型对象访问(仅供参考,我使用的是 FMDB)。我正在使用几种辅助方法来查询数据库并从结果中创建对象。我发现大多数辅助方法代码都从模型对象复制到模型对象(例如:MyObjectA&MyObjectB都具有这些相同的功能:

-(Foo *)getFooForKey:(NSInteger)key;
-(NSArray *)getBarsForFoo:(Foo *)foo;
-(Boo *)getBooForKey:(NSInteger)key;

MyObjectA&MyObjectB两者都有完全不同的目的,但它们依靠这些助手来获取 Foo、Bar 和 Boo 对象以达到它们的目的。

在不复制一堆代码的情况下使这些辅助方法可用的最佳方法是什么?我不想使用单例。有人可以提供一些选择吗?

4

1 回答 1

0

如果您想扩展数据库包装器的功能,只需覆盖 FMDatabase 或创建一个类别。

但是,您不应该在多个线程上共享 FMDatabase(尽量避免共享数据库包装器)。只需为每个对象创建一个 FMDatabase 对象,您就会做得很好。确保您将使用线程安全方法。

(以下行引用自 FMDB 文档https://github.com/ccgus/fmdb

所以不要实例化单个 FMDatabase 对象并跨多个线程使用它。

相反,使用 FMDatabaseQueue。它是你的朋友,它可以为你提供帮助。以下是如何使用它:

首先,排好队。

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; 

[queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    } }];
于 2012-04-22T19:07:08.697 回答