如何清除一个实体并在使用魔法记录添加新记录后
How to purge an entity and after add new records with magical record
当我请求新数据时,我想在添加新闻之前删除所有记录。有时记录的旧数据和新数据之间没有变化。
这是我尝试过的方法,但我的新记录从未保存(总是保存 0 条记录)
当我请求数据时:
Autorisation* aut = [Autorisation MR_createEntity];
// setter method
当我要保存时:
+(void)saveAutorisationList:(NSMutableArray*)autorisationList{
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
for (Autorisation* aut in [self getAutorisationList]) {
[aut MR_deleteEntityInContext:localContext]; // method that return all Autorisation
}
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL contextDidSave, NSError * error) {
for (Autorisation* aut in autorisationList) {
[aut MR_inContext:localContext];
}
[localContext MR_saveToPersistentStoreWithCompletion:nil];
}];
}
+(NSMutableArray*)getAutorisationList {
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
return [[Autorisation MR_findAllInContext:localContext] mutableCopy];
}
这里发生的事情是您正在删除所有对象,包括您要保存的对象。这是一步一步发生的事情:
+(void)saveAutorisationList:(NSMutableArray*)autorisationList {
// as it seems, here autorisationList is a list of new objects you want to save.
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
错误行为从这里开始:
for (Autorisation* aut in [self getAutorisationList]) {
此处 getAutorisationList
获取所有对象,当前存在于 localContext
,旧的 + 新的。
[aut MR_deleteEntityInContext:localContext];
// here you deleted each Autorisation object currently existing, including those you want to save
}
...
}
相反,您应该找出您收到的内容与之前存在的内容之间的差异,并仅删除那些未随更新收到的对象。
例如假设您有一组对象 OldSet = {auth1, auth2, auth3}
,并且通过更新您收到了对象 NewSet = {auth2, auth3, auth4}
。
删除差异为
ToBeDeletedSet = OldSet - NewSet = {auth1}
这样既可以保留已有的记录,也可以保存新的记录。
然后,您的保存方法将如下所示:
+(void)saveAutorisationList:(NSMutableArray*)updatedAutorisationList{
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
NSMutableArray *oldAutorisationList = [self getAutorisationList];
[oldAutorisationList removeObjectsInArray: updatedAutorisationList];
for (Autorisation* aut in oldAutorisationList) {
[aut MR_deleteEntityInContext:localContext]; // method that return all Autorisation
}
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL contextDidSave, NSError * error) {
for (Autorisation* aut in updatedAutorisationList) {
[aut MR_inContext:localContext];
}
[localContext MR_saveToPersistentStoreWithCompletion:nil];
}];
}
当我请求新数据时,我想在添加新闻之前删除所有记录。有时记录的旧数据和新数据之间没有变化。
这是我尝试过的方法,但我的新记录从未保存(总是保存 0 条记录)
当我请求数据时:
Autorisation* aut = [Autorisation MR_createEntity];
// setter method
当我要保存时:
+(void)saveAutorisationList:(NSMutableArray*)autorisationList{
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
for (Autorisation* aut in [self getAutorisationList]) {
[aut MR_deleteEntityInContext:localContext]; // method that return all Autorisation
}
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL contextDidSave, NSError * error) {
for (Autorisation* aut in autorisationList) {
[aut MR_inContext:localContext];
}
[localContext MR_saveToPersistentStoreWithCompletion:nil];
}];
}
+(NSMutableArray*)getAutorisationList {
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
return [[Autorisation MR_findAllInContext:localContext] mutableCopy];
}
这里发生的事情是您正在删除所有对象,包括您要保存的对象。这是一步一步发生的事情:
+(void)saveAutorisationList:(NSMutableArray*)autorisationList {
// as it seems, here autorisationList is a list of new objects you want to save.
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
错误行为从这里开始:
for (Autorisation* aut in [self getAutorisationList]) {
此处 getAutorisationList
获取所有对象,当前存在于 localContext
,旧的 + 新的。
[aut MR_deleteEntityInContext:localContext];
// here you deleted each Autorisation object currently existing, including those you want to save
}
...
}
相反,您应该找出您收到的内容与之前存在的内容之间的差异,并仅删除那些未随更新收到的对象。
例如假设您有一组对象 OldSet = {auth1, auth2, auth3}
,并且通过更新您收到了对象 NewSet = {auth2, auth3, auth4}
。
删除差异为
ToBeDeletedSet = OldSet - NewSet = {auth1}
这样既可以保留已有的记录,也可以保存新的记录。
然后,您的保存方法将如下所示:
+(void)saveAutorisationList:(NSMutableArray*)updatedAutorisationList{
NSManagedObjectContext* localContext = [NSManagedObjectContext MR_defaultContext];
NSMutableArray *oldAutorisationList = [self getAutorisationList];
[oldAutorisationList removeObjectsInArray: updatedAutorisationList];
for (Autorisation* aut in oldAutorisationList) {
[aut MR_deleteEntityInContext:localContext]; // method that return all Autorisation
}
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL contextDidSave, NSError * error) {
for (Autorisation* aut in updatedAutorisationList) {
[aut MR_inContext:localContext];
}
[localContext MR_saveToPersistentStoreWithCompletion:nil];
}];
}