Самоотношение портит содержимое при извлечении - PullRequest
2 голосов
/ 08 февраля 2011

Я имею дело с раздражающей проблемой в основных данных. У меня есть таблица с именем Символ , которая сделана следующим образом:

Character table structure

IЗаполняю таблицу различными шагами:
1) заполняем атрибуты таблицы
2) заполняем символьное соотношение ( charRel )

FYI charRel определяется следующим образом

charRel structure

Я загружаю содержимое, извлекая данные из XML, код подачи - это

curStr = [[NSMutableString stringWithString:[curStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]] retain];
NSLog(@"Parsing relation within these keys %@, in order to get'em associated",curStr);
NSArray *chunks = [curStr componentsSeparatedByString: @","];

for( NSString *relId in chunks ) {
    NSLog(@"Associating %@ with id %@",[currentCharacter valueForKey:@"character_id"], relId);
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"character_id == %@", relId];
    [request setEntity:[NSEntityDescription entityForName:@"Character" inManagedObjectContext:[self managedObjectContext] ]];
    [request setPredicate:predicate];

    NSerror *error = nil;
    NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:&error];

    // error handling code
    if(error != nil)
    {
    NSLog(@"[SYMBOL CORRELATION]: retrieving correlated symbol error: %@", [error localizedDescription]);
    } else if([results count] > 0) {
    Character *relatedChar = [results objectAtIndex:0]; // grab the first result in the stack, could be done better!
    [currentCharacter addCharRelObject:relatedChar];

    //VICE VERSA RELATIONS
    NSArray *charRels = [relatedChar valueForKey:@"charRel"];
    BOOL alreadyRelated = NO;
    for(Character *charRel in charRels) {
        if([[charRel valueForKey:@"character_id"] isEqual:[currentCharacter valueForKey:@"character_id"]])    
        {
        alreadyRelated = YES;
        break;
        }
    }

    if(!alreadyRelated)
    {
        NSLog(@"\n\t\trelating %@ with %@", [relatedChar valueForKey:@"character_id"], [currentCharacter valueForKey:@"character_id"]);
        [relatedChar addCharRelObject:currentCharacter];
    }

    } else {
    NSLog(@"[SYMBOL CORRELATION]: related symbol was not found! ##SKIPPING-->");
    }
    [request release];
}

NSLog(@"\t\t### TOTAL OF REALTIONS FOR ID %@: %d\n%@", [currentCharacter valueForKey:@"character_id"], [[currentCharacter valueForKey:@"charRel"] count], currentCharacter);

error = nil;
/* SAVE THE CONTEXT */
if (![managedObjectContext save:&error]) {
    NSLog(@"Whoops, couldn't save the symbol record: %@", [error localizedDescription]);
    NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
    if(detailedErrors != nil && [detailedErrors count] > 0) {
    for(NSError* detailedError in detailedErrors) {
        NSLog(@"\n################\t\tDetailedError: %@\n################", [detailedError userInfo]);
    }
    }
    else {
    NSLog(@"  %@", [error userInfo]);
    }
}

в этот момент, когда я распечатываюВ значениях currentCharacter все выглядит идеально.каждое отношение на своем месте.Например, в этом журнале мы ясно видим, что этот элемент имеет 3 элемента в charRel:

<Character: 0x5593af0> (entity: Character; id: 0x55938c0 <x-coredata://67288D50-D349-4B19-B7CB-F7AC4671AD61/Character/p86> ; data: {
    catRel = "<relationship fault: 0x9a29db0 'catRel'>";
    charRel =     (
        "0x9a1f870 <x-coredata://67288D50-D349-4B19-B7CB-F7AC4671AD61/Character/p74>",
        "0x9a14bd0 <x-coredata://67288D50-D349-4B19-B7CB-F7AC4671AD61/Character/p109>",
        "0x558ba00 <x-coredata://67288D50-D349-4B19-B7CB-F7AC4671AD61/Character/p5>"
    );
    "character_id" = 254;
    examplesRel = "<relationship fault: 0x9a29df0 'examplesRel'>";
    meaning = "\n  Left";
    pinyin = "\n  zu\U01d2";
    "pronunciation_it" = "\n  zu\U01d2";
    strokenumber = 5;
    text = "\n  \n    <p>The most ancient form of this symbol";
    unicodevalue = "\n  \U5de6";
})

, затем, когда мне нужно получить этот элемент, я выполняю извлечение, например так:

// at first I get the single Character record
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSError *error;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"character_id == %@", self.char_id ];
[request setEntity:[NSEntityDescription entityForName:@"Character" inManagedObjectContext:_context ]];
[request setPredicate:predicate];
NSArray *fetchedObjs = [_context executeFetchRequest:request error:&error];

когда, например, я распечатываю в NSLog содержимое charRel

NSArray *correlations = [singleCharacter valueForKey:@"charRel"];
NSLog(@"CHARACTER OBJECT \n%@", correlations);

Я получаю

Relationship fault for (<NSRelationshipDescription: 0x5568520>), name charRel, isOptional 1, 
isTransient 0, entity Character, renamingIdentifier charRel, validation predicates (), warnings (), 
versionHashModifier (null), destination entity Character, inverseRelationship (null), minCount 1, 
maxCount 99 on 0x6937f00

надежду, что я ясно дал понять.
это сводит меня с ума, я гуглил по всему миру, но
я не мог найти решение (и это заставляет меня думать как о проблеме, связанной с плохим кодированием: P).

заранее спасибо, ребята.
k

Ответы [ 2 ]

0 голосов
/ 22 февраля 2011

хорошо, я решил эту проблему,
проблема была связана с некоторыми фактами:

1) отношение должно быть обратным, иначе система по некоторым (неизвестным) причинам все испортила.[как показано на рисунке ниже]

enter image description here

2) Чтобы эта модель работала правильно, сохраняя вещи в реальном режиме, я добавил

[managedObjectContext refreshObject:relatedChar mergeChanges:YES];

и

[managedObjectContext processPendingChanges];
[managedObjectContext refreshObject:currentCharacter mergeChanges:YES];
0 голосов
/ 14 февраля 2011

Попытка использования [managedObjectContext processPendingChanges]; после внесения изменений в управляемый объект, но перед сохранением контекста.

...