删除魔法记录导入时的孤立对象

glu*_*ued 5 core-data ios magicalrecord

处理孤儿是否有任何内置于魔法记录中的东西?例如,如果我加载以下JSON数据...

[
  { "_id"   : "b1", "name"  : "brandA"},
  { "_id"   : "b2", "name"  : "brandB"},
  { "_id"   : "b3", "name"  : "brandC"}
]
Run Code Online (Sandbox Code Playgroud)

然后数据得到更新brandC并被删除

[
  { "_id"   : "b1", "name"  : "brandA"},
  { "_id"   : "b2", "name"  : "brandB"}
]
Run Code Online (Sandbox Code Playgroud)

更重要的是,如何删除孤立的嵌套对象,productB如下图所示

[
  { "_id"   : "b1", 
    "name"  : "brandA"
    "products" : [
        {"_id" : "p1", "name" : "productA" },
        {"_id" : "p2", "name" : "productB" }
     ]
  },
  { "_id"   : "b2", 
    "name"  : "brandB"
    "products" : [
        {"_id" : "p3", "name" : "productC" },
        {"_id" : "p4", "name" : "productD" }
     ]
  }
]
Run Code Online (Sandbox Code Playgroud)

glu*_*ued 9

想出来,但如果有人想用更好的解决方案,请这样做.

在加载时删除"级别0"上的孤立

NSArray *newdata   =  [];//AN ARRAY OF NEW DATA
NSArray *idList         = [newdata valueForKey:@"_id"];
NSPredicate *predicate  = [NSPredicate predicateWithFormat:@"NOT(_id IN %@)", idList];
[MRBrand MR_deleteAllMatchingPredicate:predicate];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
Run Code Online (Sandbox Code Playgroud)

删除托管对象中"级别1"上的嵌套孤立

-(void)willImport:(id)data{
    NSArray *idList         = [data[@"products"] valueForKey:@"_id"];
    NSPredicate *predicate  = [NSPredicate predicateWithFormat:@"NOT(pid IN %@) AND brand.bid == %@", idList, self.bid];
    [Product MR_deleteAllMatchingPredicate:predicate inContext:self.managedObjectContext];
}
Run Code Online (Sandbox Code Playgroud)

在品牌实体中willImport我们正在搜索与新数据不匹配的产品ID并将其删除.