【问题标题】:How do I manage multiple objects accessing an sqlite database in an iPhone app?如何在 iPhone 应用程序中管理访问 sqlite 数据库的多个对象?
【发布时间】:2012-01-20 20:36:35
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不简单地重写 FMDatabase 类?

标签: iphone ios4 sqlite fmdb


【解决方案1】:

如果您想扩展数据库包装器的功能,只需覆盖 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]) {
        …
    } }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2020-02-26
    • 2016-09-20
    • 2011-10-22
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多