1

「サーバー」マシン(同じLAN)でAFPを介して永続ストアがSQLiteを使用するアプリのプロトタイプを構築しています。ただし、アプリの 2 つの異なるインスタンスからストアに接続できません。

次のように、永続ストア コーディネーターに SQLite プラグマ設定 (ロックに関連) を設定します。

    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];

NSMutableDictionary *pragmaOptions = [NSMutableDictionary dictionary];
[pragmaOptions setObject:@"NORMAL" forKey:@"locking_mode"];
NSDictionary *storeOptions = [NSDictionary dictionaryWithObject:pragmaOptions forKey:NSSQLitePragmasOption];

if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:storeOptions error:&error]) {
    [[NSApplication sharedApplication] presentError:error];
    return nil;
}

2 番目のクライアントからストアに接続しようとしたときに表示されるエラー メッセージ (つまり、1 番目のクライアントが既に正常に接続されている場合) は次のとおりです。

エラー: sqlite データベースはロックされています。これは、.../TestDBApp.storedata でホスト排他ロックを保持している別のホストによって使用されているためです。このホスト UID... は、他のホスト UID... が .../.TestDBApp.storedata-conch のロックを解除するまで、ホスト排他ロックをオーバーライドできません

私は何か間違ったことをしていますか?

Core Data と SQLite を使用して、2 つのクライアントから同じストアにアクセスできますか?

これは Core Data や SQLite API のバグですか?

4

2 に答える 2

0

私が覚えている限り、コア データは保存方法に排他ロック モードを使用します。アプリに引数「-com.apple.CoreData.SQLDebug 1」を渡すことをお勧めします。コンソールに「BEGIN EXCLUSIVE」と表示された場合、その設定は Core Data によって無視されていると思います。

于 2012-10-20T14:14:22.990 に答える
0

SQLite では、データベース ファイルに複数の書き込みロックを設定することはできません。書き込みロックは、データを変更するトランザクションに対して、またはアプリケーションが明示的に要求したときに取得されます。

どうやら、Core Data 接続は、書き込みトランザクションまたは書き込みロックを開いたままにしています。

于 2012-09-18T11:17:19.660 に答える