1

NSPersistentStoreCoordinatorに、複数の永続ストアの削除と挿入を管理させようとしています。これまでのところ、PSCを2つのストアで構成することができ、インデックスを指定することでどちらかのストアを削除することができました。

このように…</p>

NSPersistentStore *store = [[self.persistentStoreCoordinator persistentStores] objectAtIndex:0];

        if (![self.persistentStoreCoordinator removePersistentStore:store error:&error]) {

            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

            abort();

        }

        [[NSFileManager defaultManager] removeItemAtURL:store.URL error:&error];

しかし、ストアをPSCに追加し直すと、インデックス値が正しくなく、既存のクラスメソッドでは指定できないことがわかりました。この結果、新しいデータがダウンロードされ、間違ったストアに追加されます。

これを行う方法について誰かが何か提案がありますか?

背景(更新)

2つの永続ストアを使用する理由は、ネットワーク経由でダウンロードされる2つのxmlドキュメントに一意のストアを指定できるようにするためです。これらのファイルはどちらも比較的大きいので、ネットワークトラフィックを減らしたいと思っています。したがって、いずれかのファイルが変更されているかどうかを確認するためのチェックが行われます。ある場合は、対応する永続ストアが削除され、新しいストアが追加されます。この時点で問題が始まります。新しいストアを追加すると、常にそれがPersistentStoresArrayの最後に追加されます。これにより、データをMOCとマージして戻すときに、ストアに不一致が生じるように見えます。

コード これまでに試したもので、永続ストアを削除および追加しますが、新しいデータは間違ったストアに追加されます。

static NSString * const kLastDateStoreUpdateKey = @"eventLastStoreUpdateKey";

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

NSString *last_modified = [NSString stringWithFormat:@"%@",[[(NSHTTPURLResponse *)response allHeaderFields] objectForKey:@"Last-Modified"]];

NSDateFormatter *dFormatter = [[NSDateFormatter alloc] init];
[dFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];
[dFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]];
[dFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

dateModified = [dFormatter dateFromString:last_modified];
NSDate *previousDate = [[NSUserDefaults standardUserDefaults] objectForKey:kLastDateStoreUpdateKey];

if (!previousDate || [previousDate compare:dateModified] != NSOrderedSame) {

    [self.managedObjectContext lock];
    [self.managedObjectContext reset];


    if ([[NSFileManager defaultManager] fileExistsAtPath:self.persistentStorePath]) {
        NSError *error = nil;

        NSArray *stores = [self.persistentStoreCoordinator persistentStores];
        NSURL *storeUrls = [NSURL fileURLWithPath:persistentStorePath];
        for (NSPersistentStore *store in stores){

            if ([[store.URL absoluteURL] isEqual:[storeUrls absoluteURL]]) {
                if (![self.persistentStoreCoordinator removePersistentStore:store error:&error]) {
                    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                    abort();
                }
                [[NSFileManager defaultManager] removeItemAtURL:store.URL error:&error];
                NSLog(@"Check store removed %@", [self.persistentStoreCoordinator persistentStores]);
            }
        }
    }

   NSURL *storeUrl = [NSURL fileURLWithPath:persistentStorePath];
    NSError *error = nil;
    [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error];
    if (error) {
        NSLog(@"event error %@ %@",error, [[self.persistentStoreCoordinator persistentStores] objectAtIndex:0]);
    }
    NSLog(@"Check store added %@",self.persistentStoreCoordinator.persistentStores);

    [self.managedObjectContext unlock];

}else {
    [self cancelDownload];
    NSLog(@"event cancel %@ %@ %@",previousDate, dateModified, [self.persistentStoreCoordinator persistentStores]);
}
}

ハンターが以下で指摘したように解決済み私のPSC構成はnilに設定されました。そのため、データは個々の永続ストアに追加されていませんでした。コアデータモデルで構成を作成し、関連するエンティティをターゲットにしたとき、PSCにその構成を設定しました。その後、期待どおりに機能しました。下記参照。

   NSURL *storeUrl = [NSURL fileURLWithPath:persistentStorePath];
NSError *error = nil;
[self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"ConfigEvent" URL:storeUrl options:nil error:&error];
if (error) {
    NSLog(@"event error %@ %@",error, [[self.persistentStoreCoordinator persistentStores] objectAtIndex:0]);
}
NSLog(@"Check store added %@",self.persistentStoreCoordinator.persistentStores);
4

2 に答える 2

2

2つのストアが本当に必要な場合[これが本当に最善の方法かどうかは説明からわかりません]、配列に依存するのではなく、プロパティまたはivarを介してそれらを参照することをお勧めします。

または、PSCのstores配列を反復処理し、URLを調べてそれぞれを識別することもできます。

アップデート:

さまざまなNSPersistentStoreに特定のデータを保存する際に問題が発生した場合は、CoreDataの構成を確認してください。これにより、特定のエンティティを特定の永続ストアに配置するようにCoreDataに指示できます。

モデルで構成を指定し、永続ストアを追加するときに指定します。詳細はこちら:https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMOM.html

于 2012-05-09T15:13:46.523 に答える
0

これは、1つの永続ストアコーディネーターと2つの管理対象オブジェクトコンテキストで実現できるはずです。パフォーマンスを低下させるロックが発生している場合は、2つの永続ストアコーディネーターの複雑さに進む必要があります。

覚えておいてください:最も単純なもの(tm)

于 2012-05-09T13:26:21.777 に答える