FMDatabaseQueue
さまざまなクラスを介してアクセスできるようにする方法はいくつかあります。シングルトンにするか、アプリのデリゲートのプロパティにするか (からアプリのデリゲートを取得することで取得できます[[UIApplication sharedApplication] delegate]
)、最初のビュー コントローラーで作成して渡します。
個人的には、シングルトン オブジェクトに傾倒しますDatabaseManager
。ファイルは次の@interface
ようになります。
//
// DatabaseManager.h
// Database Manager Example
//
// Created by Robert Ryan on 6/24/13.
// Copyright (c) 2013 Robert Ryan. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "FMDatabaseQueue.h"
@interface DatabaseManager : NSObject
@property (nonatomic, strong) FMDatabaseQueue *databaseQueue;
+ (instancetype)sharedManager;
@end
次の@implementation
ようになります。
//
// DatabaseManager.m
// Database Manager Example
//
// Created by Robert Ryan on 6/24/13.
// Copyright (c) 2013 Robert Ryan. All rights reserved.
//
#import "DatabaseManager.h"
@implementation DatabaseManager
+ (instancetype)sharedManager
{
static id sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init
{
self = [super init];
if (self) {
_databaseQueue = [[FMDatabaseQueue alloc] initWithPath:[self databasePath]];
}
return self;
}
- (NSString *)databasePath
{
NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
return [docsPath stringByAppendingPathComponent:@"test.sqlite"];
}
@end
次に、このシングルトンを使用する場合は、DatabaseManager.h
ヘッダー ファイルを含めて、次のようにします。
#import "ViewController.h"
#import "DatabaseManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
DatabaseManager *databaseManager = [DatabaseManager sharedManager];
[databaseManager.databaseQueue inDatabase:^(FMDatabase *db) {
FMResultSet *result = [db executeQuery:@"SELECT * FROM TABLE1"];
if (!result) {
NSLog(@"%s: executeQuery error: %@", __FUNCTION__, [db lastErrorMessage]);
return;
}
while ([result next]) {
// do whatever you want with the results
}
[result close];
}];
}
// the rest of your code here
@end
つまり、databaseModel
シングルトンを廃止し (ところで、クラス名は慣例により大文字で始める必要があります)、FMDatabaseQueue
オブジェクトのシングルトンを作成します。次に、ブロック内で、外部データベース オブジェクトを参照するのではなく、パラメーターをinDatabase
参照するだけです。db
シングルトンをNSObject
サブクラスにしたことに注意してください。これFMDatabaseQueue
はそのクラスのパブリック プロパティです。ここにはたくさんの選択肢があります。たとえば、シングルトンFMDatabaseQueue
自体をサブクラスにすることもできます(サブクラスのように見える現在のdatabaseModel
オブジェクトで行ったようですFMDatabase
)。あるいは、私の個人的な好みとして、私は実際にFMDatabaseQueue
オブジェクトを私の私有財産にしますDatabaseManager
コントローラーなどから FMDB コードを削除します。すべての FMDB コードを、この新しいシングルトン、または場合によってはモデル オブジェクトに保持します。大きな毛むくじゃらのプロジェクトを取得する場合、SQL ステートメントがあちこちに散らばることはおそらく望ましくありません。個人的には、FMDB コードと SQL ステートメントは実装の詳細であり、DatabaseManager
クラスまたはモデル クラスにカプセル化する必要があると思います。そうすれば、巨大なプロジェクトの管理が少し楽になります。でも、好きなようにできます。