2013-09-30 4 views
0

Я попытался добавить объекты в свою основную модель данных. Но, когда я пытаюсь их отобразить, их там нет. Я использую категорию в качестве помощника.Основные данные addObject отношение «один ко многим »Определение

+ (Project *)createProjectWithDictionary:(NSDictionary *)dic inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext { 

    Project *project = nil; 

    // Build a fetch request to see if we can find this Flickr photo in the database. 
    // The "unique" attribute in Photo is Flickr's "id" which is guaranteed by Flickr to be unique. 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Project"]; 
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]]; 
    request.predicate = [NSPredicate predicateWithFormat:@"title = %@", [dic[kTagProjectTitle]description]]; 

    // Execute the fetch 

    NSError *error = nil; 
    NSArray *matches = [managedObjectContext executeFetchRequest:request error:&error]; 

    // Check what happened in the fetch 

    if (!matches || ([matches count] > 1)) { // nil means fetch failed; more than one impossible (unique!) 
     // handle error 
    } else if (![matches count]) { // none found, so let's create a Photo for that Flickr photo 
     project = [NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:managedObjectContext]; 
     NSLog(@"Encontrado Primera vez"); 

     project.projectId = [NSNumber numberWithInt:[[dic valueForKey:kTagProjectId] intValue]]; 
     project.title = [dic valueForKey:kTagProjectTitle]; 
     project.estimatedPrice = [NSNumber numberWithInt:[[dic valueForKey:kTagProjectEstimatedPrice] floatValue]]; 
     NSMutableArray *tags = [[NSMutableArray alloc] init]; 
     tags = [dic objectForKey:kTagProjectsTags]; 

     NSMutableSet *tagSet = [[NSMutableSet alloc]init]; 
     for (NSDictionary * tagDic in tags){ 
      NSString *tagName = [tagDic objectForKey:kTagProjectTagName]; 
      Tag *tag = [Tag insertTagName:tagName inManagedObjectContext:managedObjectContext]; 
      [project addTagsObject:tag]; 
     } 

     // [project addTags:tagSet]; 

Я попытался с помощью NSMutableSet с AddObject: (NSSet * тегов), а также с addTagObject и у меня есть один и тот же выход в NSLog.

  for(Tag *tag in project.tags){ 
       NSLog(@"TAG TITLES %@", tag.name); 
      } 
     2013-09-30 23:03:36.003 Prototype[28959:c07] TAG TITLES iOS 
     2013-09-30 23:03:36.004 Prototype[28959:c07] TAG TITLES Windows Phone 
    } 

Затем, когда я пытаюсь отобразить их в камере. У меня новый NSLog, и это результат. Почему в первом ящике NSLog я вижу их, а не в методе cellForRowAtIndexPath?

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    Project *project = (Project *)[self.data objectAtIndex:indexPath.row]; 
    NSLog(@"TITLE %@", project.tags); 
} 

ВЫВОД

TITLE Relationship 'tags' on managed object (0x7c60ba0) <Project: 0x7c60ba0> (entity: Project; id: 0x7c60be0 <x-coredata:///Project/tE9F74F99-04BC-43CC-BD68-F435712B3B3C9> ; data: { 

    estimatedPrice = 1999; 
    projectId = 418; 
    tags =  (
    ); 
    title = "Aplicaci\U00f3n IOS"; 
    "yp_desc" = nil; 
}) with objects {(
)} 

} 
+0

Is '[Tag insertTagName: tagName inManagedObjectContext: managedObjectContext];' вызов 'insertNewObjectForEntityForName: inManagedObjectContext:'? – Jarig

+0

Да, '[Вставка тегаTagName: tagName inManagedObjectContext: managedObjectContext];' почти такой же метод, как [Project create ..... но obviusly change variables – croigsalvador

ответ

1

Скорее всего вы не сохранили контекст после добавления тегов.

+0

Сохранение контекста после добавления объекта тегов. Я получаю этот вывод: «теги = <ошибка связи: 0x7c73f50« теги »> – croigsalvador

+0

Все в порядке. Это означает, что на самом деле данные не извлекаются из базы данных - это будет извлечено после доступа к некоторым свойствам объекта. все будет работать нормально –

+0

Я положил это в NSLog в cellForRowAtIndexPath: 'int i = 0; для (тег тега в файле project.tags) { NSString * tagName = tag.name; NSLog (@" i value = % d ", i); NSLog (@" TITLE% @ ", tagName) }' и нет вывода, что означает, что у меня нет никакого тега в моем контексте. – croigsalvador

0

Я бы порекомендовал вам использовать магическую структуру записи (https://github.com/magicalpanda/magicalrecord), это упростит управление основными данными!

В другой стороны, если вы хотите продолжать без него я буду стараться изменения:

+ (Project *)createProjectWithDictionary:(NSDictionary *)dic inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext { 

    Project *project = nil; 

    // Build a fetch request to see if we can find this Flickr photo in the database. 
    // The "unique" attribute in Photo is Flickr's "id" which is guaranteed by Flickr to be unique. 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Project"]; 
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]]; 
    request.predicate = [NSPredicate predicateWithFormat:@"title = %@", [dic[kTagProjectTitle]description]]; 

    // Execute the fetch 

    NSError *error = nil; 
    NSArray *matches = [managedObjectContext executeFetchRequest:request error:&error]; 

    // Check what happened in the fetch 

    if (!matches || ([matches count] > 1)) { // nil means fetch failed; more than one impossible (unique!) 
     // handle error 
    } else if (![matches count]) { // none found, so let's create a Photo for that Flickr photo 
     project = [matches lastObject]; 
     NSLog(@"Encontrado Primera vez"); 

     //Makes that only if you want to rehydrate your saved object. At other way I am not sure what yo want to do here :S 
     project.projectId = [NSNumber numberWithInt:[[dic valueForKey:kTagProjectId] intValue]]; 
     project.title = [dic valueForKey:kTagProjectTitle]; 
     project.estimatedPrice = [NSNumber numberWithInt:[[dic valueForKey:kTagProjectEstimatedPrice] floatValue]]; 
     NSMutableArray *tags = [[NSMutableArray alloc] init]; 
     tags = [dic objectForKey:kTagProjectsTags]; 

     for (NSDictionary * tagDic in tags){ 
      NSString *tagName = [tagDic objectForKey:kTagProjectTagName]; 
      Tag *tag = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:managedObjectContext]; 
      //TODO: populate tag object using tagDic 
      [project addTagsObject:tag]; 
     } 

И помните, чтобы сделать выборку в том же контексте, если вы не сохранили текущий контекст;)

Смежные вопросы