2012-04-11 4 views
-1

In meiner Anwendung habe ich Category und Sub_Category Entities, die eine zu viele Beziehung zwischen ihnen haben.Beziehung zwischen Entitäten nicht persistent

Erstens, wenn die App zum ersten Mal läuft die Beziehung Attribut (category_subCategory) arbeitet wie folgt:

2012-04-11 04:03:39.344 SupplyTrackerApp[27031:12f03] Saved 
2012-04-11 04:03:47.423 SupplyTrackerApp[27031:fb03] Category<Category: 0x6ba4e90> (entity: Category; id: 0x6e95620 <x-coredata://00E5784E-D032-41DD-BD60-B85B0BBF8E31/Category/p1> ; data: { 
    categoryID = 1; 
    categoryName = Antiques; 
    "category_SubCategory" =  (
     "0x6ebb4f0 <x-coredata://00E5784E-D032-41DD-BD60-B85B0BBF8E31/Sub_Category/p1>" 
    ); 
    catetogoryDescription = "Contains a Sub categories related to Antique pieces"; 
}) 

aber wenn ich die App einen Neustart der Anwendung beenden, diese Beziehung funktioniert existiert. Die Ausgabe sieht aus wie ..

2012-04-11 04:05:04.455 SupplyTrackerApp[27038:fb03] In Cell for row at index path 
2012-04-11 04:05:05.548 SupplyTrackerApp[27038:fb03] Category<Category: 0x6ecaca0> (entity: Category; id: 0x6eb4ab0 <x-coredata://00E5784E-D032-41DD-BD60-B85B0BBF8E31/Category/p1> ; data: { 
    categoryID = 1; 
    categoryName = Antiques; 
    "category_SubCategory" = "<relationship fault: 0x6ecf0a0 'category_SubCategory'>"; 
    catetogoryDescription = "Contains a Sub categories related to Antique pieces"; 
}) 

Hier ist, wo ich rufe die Einheiten erstellen ..

-(void) loadDataIntoDocument{ 


    NSLog(@"In Load Data"); 

    dispatch_queue_t fetch=dispatch_queue_create("Data Fetcher", NULL); 

    dispatch_async(fetch, ^{ 



      [Sub_Category createSubCategory:context]; 


      NSError *error; 


      if (![context save:&error]) { 
       NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
      }else { 


       NSLog(@"Saved"); 
      } 


    }); 




    dispatch_release(fetch); 


} 

So ist die Sub_Category + Kategorie Datei erstellen den folgenden Code ein.

+(Sub_Category *) createSubCategory:(NSManagedObjectContext *)context{ 


    Sub_Category *subCategory=nil; 

    NSFetchRequest *request=[NSFetchRequest fetchRequestWithEntityName:@"Sub_Category"]; 

    request.predicate=[NSPredicate predicateWithFormat:@"subCategoryID=%@", @"11"]; 

    NSSortDescriptor *sortDescriptor=[NSSortDescriptor sortDescriptorWithKey:@"subCategoryName" ascending:YES]; 

    request.sortDescriptors=[NSArray arrayWithObject:sortDescriptor]; 



    NSError *error; 

    NSArray *matches=[context executeFetchRequest:request error:&error]; 

    if (!matches||[matches count]>1) { 
     ///errorrrrrrrrrr 
    } else if([matches count]==0) { 


     subCategory=[NSEntityDescription insertNewObjectForEntityForName:@"Sub_Category" inManagedObjectContext:context]; 

     subCategory.subCategoryID=[NSString stringWithFormat:@"%i", 11]; 

     [email protected]"Antiquities"; 

     [email protected]"Contains several products related to antiquities"; 



     subCategory.subCategory_Category =[Category createCategory:context]; 

    }else { 
     subCategory=[matches lastObject]; 
    } 



    return subCategory; 



} 

Und dann rufe ich die Kategorie + Kategorie erstellen Datei, die den folgenden Code hat.

+(Category *) createCategory:(NSManagedObjectContext *)context{ 


    Category *category=nil; 

    NSFetchRequest *request=[NSFetchRequest fetchRequestWithEntityName:@"Category"]; 

    request.predicate=[NSPredicate predicateWithFormat:@"categoryID=%@", @"1"]; 

    NSSortDescriptor *sortDescriptor=[NSSortDescriptor sortDescriptorWithKey:@"categoryName" ascending:YES]; 

    request.sortDescriptors=[NSArray arrayWithObject:sortDescriptor]; 


    NSError *error; 

    NSArray *matches=[context executeFetchRequest:request error:&error]; 

    if (!matches||[matches count]>1) { 
     ///errorrrrrrrrrr 
      } else if([matches count]==0) { 

       category=[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:context]; 

       category.categoryID=[NSString stringWithFormat:@"%d",1]; 

       [email protected]"Antiques"; 

       [email protected]"Contains a Sub categories related to Antique pieces"; 




      }else { 
       category=[matches lastObject]; 
      } 






    return category; 

} 

Kann mir jemand helfen, in Bezug auf diese aus ..

ich von wenigen Tagen auf das bin stecken ...

+0

Ich bin mir nicht sicher, ob ich genau verstehe, was falsch läuft. Führt NSLog() den Fehler von executeFetchRequest aus? –

+0

Es gibt keinen Fehler beim Ausführen der executeFetchRequest. Auch zeigt es die Beziehung zwischen ihnen, wenn die Anwendung zum ersten Mal ausgeführt wird. Aber wenn ich die Anwendung verlasse und die Kategorie Entität abrufe, existiert der Beziehungswert nicht. Es zeigt so etwas wie: "" – prasad1250

Antwort

1

ich wie Sie dispatch_async sieht verwenden die -save: in der zu tun Hintergrund. Dies verstößt wahrscheinlich gegen die "Thread Confinement" -Regeln für den Umgang mit (kurz gesagt, sie sollten nur in dem Thread verwendet werden, auf dem sie erstellt wurden. Gleiches gilt für alle Objekte, die von ihnen abgerufen werden).

Weitere Informationen zur Parallelverarbeitung von Stammdaten finden Sie unter this WWDC Session.

Versuchen Sie nur, Ihren Core Data-Stack (und alle Objekte, die Sie daraus abrufen) vom Hauptthread zu verwenden.

+0

Ich habe versucht, diese dispatch_queue auch zu entfernen ... aber das gleiche passiert ... – prasad1250