2012-01-26 47 views
2

我正在将托管记录的内容打印到文件中。我有一个主要实体,比如MyAppEntity和几个相关的实体(人员,地点等)。coredata故障信息

我看到从该文件的输出:

/Users/david/Library/Application Support/iPhone Simulator/5.1/Applications/C9ACA218-F2D6-4623-8CAF-5FE763D10FC8/Documents/ 
MyApp-0001 12.01.25 
Summary goes here... 
Nothing here yet. 
Relationship 'people' on managed object (0x79eaf7f0) <NSManagedObject: 0x79eaf7f0> (entity: MyAppEntity; id: 0x79eae950 <x-coredata:/B86C9CA8-EDE4-452C-BA56-FEF50B4F0FF9/MyAppEntity/p1> ; data: { 
    audioName = 00010125121910; 
    audioNo = 0; 
    date = nil; 
    MyApp = "MyApp-0001 12.01.25"; 
    interpret = "Nothing here yet."; 
    keyword =  (
    ); 
    order = 0; 
    people =  (
     "0x79ee42f0 <x-coredata:/B86C9CA8-EDE4-452C-BA56-FEF50B4F0FF9/PeopleEntity/p1>", 
     "0x79ee4300 <x-coredata:/B86C9CA8-EDE4-452C-BA56-FEF50B4F0FF9/PeopleEntity/p2>" 
    ); 
    place =  (
     "0x79ee6970 <x-coredata:/B86C9CA8-EDE4-452C-BA56-FEF50B4F0FF9/PlaceEntity/p2>", 
     "0x79ee6960 <x-coredata:/B86C9CA8-EDE4-452C-BA56-FEF50B4F0FF9/PlaceEntity/p1>" 
    ); 
    recurring = 0; 
    summary = "Summary goes here..."; 
    symbol =  (
    ); 
    type =  (
    ); 
}) with objects {(
    <NSManagedObject: 0x79ee47e0> (entity: PeopleEntity; id: 0x79ee42f0 <x-coredata:/B86C9CA8-EDE4-452C-BA56-FEF50B4F0FF9/PeopleEntity/p1> ; data: { 
    definition = nil; 
    name = me; 
    order = 0; 
    people = "<relationship fault: 0x79ef5ce0 'people'>"; 
}), 
    <NSManagedObject: 0x79ee4a70> (entity: PeopleEntity; id: 0x79ee4300 <x-coredata:/B86C9CA8-EDE4-452C-BA56-FEF50B4F0FF9/PeopleEntity/p2> ; data: { 
    definition = nil; 
    name = you; 
    order = 1; 
    people = "<relationship fault: 0x79e60840 'people'>"; 
}) 
)} 

我有两个问题。首先,什么故障信息是什么意思?第二,我如何检索说people.name或place.name ..的值?

我可以张贴数据模型图,但它基本上是这样的:

MyAppEntity:属性: 标题 日期 详细 关系的人,地点等

PeopleEntity:属性: 名称 说明 订购 关系:人

PlaceEntity:属性: 名称 说明 订购 关系:地方

的关系是多对多。这是因为一个任务可以有很多人,同一个人可以完成多项任务。


感谢Gerry和Marcus Zarra的另一个post。我终于得到它。如果它可以帮助别人,这是我的代码:使用

NSManagedObjectContext *context = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *mainEntity = [NSEntityDescription entityForName:@"MainEntity" inManagedObjectContext:context]; 

    [fetchRequest setEntity:mains]; 
    NSError *error = nil; 
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 


    NSLog(@"Record Count is: %i", [fetchedObjects count]); 

    // THIS ACTUALLY WORKS..... 

    for (MainEntity *mains in fetchedObjects) { 
    NSLog(@"Main: %@", mains.name); 
     NSSet *peopleSet = [mains valueForKey:@"people"]; 
     for (id person in peopleSet) { 
      NSLog(@"name = %@", [person valueForKey:@"name"]); 
     } 
     NSSet *keywordSet = [mains valueForKey:@"keyword"];  
     for (id keyWord in keywordSet) { 
      NSLog(@"Keyword = %@", [keyWord valueForKey:@"word"]); 
     } 
     NSSet *placeSet = [mains valueForKey:@"place"];  
     for (id places in placeSet) { 
      NSLog(@"Place = %@", [places valueForKey:@"name"]); 
     } 
     NSSet *symbolSet = [mains valueForKey:@"symbol"]; 
     for (id symbols in symbolSet) { 
      NSLog(@"Symbol = %@", [symbols valueForKey:@"symbolName"]); 
     } 
     NSSet *typeSet = [mains valueForKey:@"type"]; 
     for (id types in typeSet) { 
      NSLog(@"Type = %@", [types valueForKey:@"typeName"]); 
     } 
    } 

    if (!fetchedObjects || error) { 
     NSLog(@"[ERROR] COREDATA: Fetch request raised an error - '%@'", [error description]); 
     return; 
    } 

回答

7

故障,使数据可以仅在需要时才会被载入。当你访问关系时,它将被加载。请参阅Core Data Programming Guide中的Faulting and Uniquing

一旦您访问多对多关系,您将有一个集合。您可以枚举集合并访问各个管理对象上的属性。例如(假设appObject是MyAppEntity的一个实例):

for (id person in [appObject valueForKey:@"people"]) { 
    NSLog(@"name = %@", [person valueForKey:@"name"]); 
} 
+1

他们真的应该选择一个其他错误的名称。它引起了很多混乱(根据它出现在这里的次数来判断,无论如何!) – jrturton

+0

谢谢Gerry。我还没有喝咖啡,所以请原谅...我输入了这段代码:NSManagedObjectContext * context = [self managedObjectContext]; \t \t NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; \t NSEntityDescription *实体= [NSEntityDescription entityForName:@ “AppEntity” \t \t \t \t \t \t \t \t inManagedObjectContext:上下文]; \t [fetchRequest setEntity:entity]; NSLog(@“name =%@”,[person valueForKey:@“name”]);}};}};}};}}; \t} ---但实体。人们给我一个错误 - 属性'人'没有在'NSEntityDescription *'类型的对象上找到' –

+0

非常感谢Gerry。通过我的英特尔4004大脑消化后,我明白你写的是什么。非常感谢...我已经在上面发布了我的最终代码。如果您发现问题,请告诉我。再次,我非常感谢。 –