3

私は、それ自体と循環関係にある1つのCoreDataエンティティを持つ非常に単純なアプリを持っています。このデータを別のアプリのplistとして使用したいと思います。

関係は、親側では「1つ」、子側では「多数」です。

基本的に、一番上に1つのアイテムがあり、次にそのオブジェクトの子、子オブジェクトの子などがあるツリー...

このデータから、リレーションシップを含むエンティティの構造を使用して辞書/pListを作成したいと思います。(それは理にかなっていますか?)

これまでのところ、ここでの他の回答の助けを借りて、すべてのオブジェクトのplist(ただし、すべて同じ「レベル」にある)または最終的な親オブジェクトのplist(ただし、子の関係は失敗しています)を取得できます。

これは、データを取得してデスクトップに保存するために私が行っていることです。

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY_NAME];
    request.resultType = NSDictionaryResultType;

    NSError *fetchError = nil;
    NSArray *results = [self.databaseDocument.managedObjectContext executeFetchRequest:request error:&fetchError];

    NSLog(@"%@", results);

    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [caches stringByAppendingPathComponent:@"/../../../../../../../../Desktop/my.plist"];
    [results writeToFile:path atomically:NO];

現在、オブジェクトは3つだけです。メインオブジェクト、そのオブジェクトの子、およびその子オブジェクトの子。

これにより、3つのオブジェクトを含む配列であるplistが得られます。

このような親を持たないオブジェクトのみを取得する述語を含めると、次のようになります。

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:ENTITY_NAME];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent == nil"];
    request.predicate = predicate;

    NSError *fetchError = nil;
    NSArray *results = [self.databaseDocument.managedObjectContext executeFetchRequest:request error:&fetchError];

    NSLog(@"%@", results);

    Item *mainItem = [results lastObject];

    NSArray *keys = [[[mainItem entity] attributesByName] allKeys];
    NSDictionary *dict = [mainItem dictionaryWithValuesForKeys:keys];

    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [caches stringByAppendingPathComponent:@"/../../../../../../../../Desktop/my.plist"];
    [dict writeToFile:path atomically:NO];

これによりディレクトリが作成されますが、子は含まれません。

私のエンティティのようにplistを構造化する方法を誰かに説明してもらえますか?つまり、すべての子が含まれている1つのディレクトリと、その子のディレクトリ内の各子の子などです。

4

1 に答える 1

3

リレーションシップの階層構造を維持しながら、Core Data エンティティを plist にエクスポートするより良い方法があるかもしれません - 私は喜んで教育を受けます。私は次のような再帰的な方法でそれらを処理することに取り組みます:(これは完全にテストされていません-説明のみを目的としています-また、plistをどのように構造化したいかなども完全にはわかりません.)

- (void)processEntity:(NSManagedObject *)object forMutableArray:(NSMutableArray *)mutableArray {
    NSMutableDictionary *entityInfo = [NSMutableDictionary new];

    // populate entityInfo with your object's properties
    // however you are doing that now...


    //  if this object has children - process them
    NSMutableArray *childArray = [NSMutableArray new];
    for( id child in object.children ) {
        [self processEntity:child forMutableArray:childArray];
    }

    [entityInfo setObject:childArray forKey:@"children"];
    [mutableArray addObject:entityInfo];
}

そのため、最上位のオブジェクト (親を持たないオブジェクト) を反復処理することからプロセスを開始し、それらを次のように処理します。processEntity:forMutableArray:

于 2012-10-06T12:06:51.920 に答える