我的iphone应用程序有一个sqlite数据库,可以被许多不同的模型对象访问(仅供参考,我正在使用FMDB)。我正在使用几个辅助方法来查询数据库并从结果中创建对象。我发现大多数辅助方法代码都是从模型对象复制到模型对象(例如:MyObjectA
& MyObjectB
都具有以下相同的功能:
-(Foo *)getFooForKey:(NSInteger)key;
-(NSArray *)getBarsForFoo:(Foo *)foo;
-(Boo *)getBooForKey:(NSInteger)key;
MyObjectA
& MyObjectB
两者的目的完全不同,但他们依靠这些助手来获得Foo,Bar和& Boo对象是为了达到目的。
在不复制大量代码的情况下,使这些辅助方法可用的最佳方法是什么?我不想使用单身人士。有人可以提供一些选择吗?
答案 0 :(得分: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]) {
…
} }];