this SO questionに関連して、データの読み込みをバックグラウンドに置きたいと思います。
ただし、「ライブラリ ルーチンの呼び出し順序が間違っています」というエラーが表示されます。
このSOスレッドでは、方法はNSOperationを使用していると言っていますが、Web上のサンプルを見ると、問題を解決する方法がわかりません。
シングルトン パターンと単一の sqlite 接続を共有します。
@interface Db : NSObject {
NSString *path;
FMDatabase* theDb;
BOOL isOpen;
}
@property (retain, nonatomic) FMDatabase *theDb;
@property (retain, nonatomic) NSString *path;
@property (nonatomic) BOOL isOpen;
--------
static Db *currentDbSingleton = nil;
#pragma mark Global access
+(id)currentDb {
@synchronized(self) {
if (!currentDbSingleton) {
NSString *reason = NSLocalizedString(@"The database is not set globally",
@"Error Db: database is not set");
NSException *e = [NSException exceptionWithName:@"DBError"
reason:reason;
userInfo:nil];
@throw e;
}
}
return currentDbSingleton;
}
同じデータベースを2回開くのは難しいです....
何か案は?
編集:
エラーがsqliteの呼び出しにあることを確認しました。それを呼び出すための薄いラッパーとして FDBM を使用します。
データをロードするためのメイン タスクとバックグラウンド タスクの 2 つのスレッドを実行しています。私はこのように実行します:
- (void) fillCache:(NSString *)theTable {
[NSThread detachNewThreadSelector:@selector(fillCacheBackground:)
toTarget:self
withObject:theTable];
}
- (void)loadComplete {
[self.table reloadData];
}
- (void) fillCacheBackground:(NSString *)theTable {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Db *db= [Db currentDb];
[db beginTransaction];
..... STUFF HERE
[db commitTransaction];
//Tell our callback what we've done
[self performSelectorOnMainThread:@selector(loadComplete)
withObject:nil
waitUntilDone:YES];
[pool drain];
}
db インターフェースのコードはhttp://code.google.com/p/chibiorm/source/browse/#svn/trunk/srcにあります。具体的には、fdbm/ とインターフェースする唯一のユニットである Db.h/m です。 sqlite。
FDBM から sqlite 関数を呼び出そうとすると、エラーが発生しました。
たとえば、ここで起こりました:
-(void) checkError {
if ([self.theDb hadError]) { // <====ERROR HERE
NSLog(@"Err %d: %@", [self.theDb lastErrorCode], [self.theDb]);
}
}
これは FDBM コードを呼び出します。
- (BOOL) hadError {
int lastErrCode = sqlite3_errcode(db);
return (lastErrCode > SQLITE_OK && lastErrCode < SQLITE_ROW);
}