Как мне управлять несколькими объектами, обращающимися к базе данных sqlite в приложении iPhone? - PullRequest
0 голосов
/ 15 декабря 2011

В моем приложении для iphone есть одна база данных sqlite, к которой обращаются многие объекты модели (к вашему сведению, я использую FMDB). Я использую несколько вспомогательных методов для запроса базы данных и создания объектов из результатов. Я обнаружил, что большая часть кода вспомогательного метода дублируется из объекта модели в объект модели (например: MyObjectA & MyObjectB оба имеют следующие идентичные функции:

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

MyObjectA и MyObjectB оба имеют совершенно разные цели, но они полагаются на то, что эти помощники получают объекты Foo, Bar и Boo для достижения своих целей.

Каков наилучший способ сделать эти вспомогательные методы доступными без дублирования кода? Я не хочу использовать синглтон. Может кто-нибудь предоставить некоторые варианты?

1 Ответ

0 голосов
/ 22 апреля 2012

Просто переопределите базу данных FMD или создайте категорию, если вы хотите расширить возможности оболочки вашей базы данных.

Однако вы не должны совместно использовать базу данных FMD для нескольких потоков (старайтесь избегать совместного использования оболочки оболочки базы данных).Просто создайте объект 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]) {
        …
    } }];
...