如何在iPhone应用程序中管理访问sqlite数据库的多个对象?

时间:2011-12-15 04:35:59

标签: iphone ios4 sqlite fmdb

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

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

MyObjectA& MyObjectB两者的目的完全不同,但他们依靠这些助手来获得Foo,Bar和& Boo对象是为了达到目的。

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

1 个答案:

答案 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]) {
        …
    } }];