从 CoreData 获取最后插入的 NSManagedObject
Posted
技术标签:
【中文标题】从 CoreData 获取最后插入的 NSManagedObject【英文标题】:get last inserted NSManagedObject from CoreData 【发布时间】:2016-03-16 06:28:58 【问题描述】:NSManagedObject是这样创建的
NSEntityDescription *entity = [NSEntityDescription entityForName:strEntityName inManagedObjectContext:managedObjContext];
NSManagedObject * managedObject = (NSManagedObject *)[[NSClassFromString(strEntityName) alloc] initWithEntity:entity insertIntoManagedObjectContext:managedObjContext];
//values are mapped into this object
现在将 NSManagedObject 保存到持久存储并获取当前插入的对象,如下所示:
NSError *error;
BOOL isDone = [managedObjectContext save:&error];
//BOOL isDone = [managedObjectContext obtainPermanentIDsForObjects:[NSArray arrayWithObjects:tempManagedObject, nil] error:&error];
if (isDone && error == nil)
//fetch last inserted object here
//make fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:strEntityName];
//make query using fetch request in context
NSError *error;
NSArray *arrFetchRequest = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (arrFetchRequest.count>0)
//This is last inserted object
NSManagedObject *managedObject = [arrFetchRequest lastObject];
return managedObject;
我也参考了Swift - How to get last insert id in Core Data, store it in NSUserDefault and predicate。但它在 NSManagedObject 中不会有永久对象 ID,因为我们正在保存临时 ID 并使用它来获取,而我们根本没有永久 ID。
谁能分享其他选择?
【问题讨论】:
有很多更好的选择。该请求将返回该实体类型的所有对象,而不仅仅是最后插入的对象。最简单的方法是保存objectID
并使用它来获取。请务必致电obtainPermanentIDsForObjects
。
@Avi : 通过使用obtainPermanentIDsForObjects
,它不会获得具有永久 ID 的 NSManagedObject。此外,我将不得不使用[NSManagedObjectContext save]
方法将记录保存在数据库中。
等等。您认为名为@987654328@ 的方法不会永久化objectID
s?请解释一下。
@Avi : 当方法调用 obtainPermanentIDsForObjects
它只返回 BOOL 值时,我不知道什么是永久 ID,因为 CoreData 不提供它。
【参考方案1】:
在上下文中插入 NSManagedObject 时,它将具有临时 ID(这意味着它尚未保存到数据库中)。
因此需要在上下文中为 NSManagedObject 获取永久ID(这意味着它已保存到数据库中),使用obtainPermanentIDsForObjects
并且相同的 NSManagedObject 将具有永久ID
if (insertManagedObject)
NSLog(@"Before %@ : %d",insertManagedObject.objectID,insertManagedObject.objectID.isTemporaryID);
//Obtain permanentID for object
NSError *error;
BOOL hasObtainedPermanentID = [managedObjectContext obtainPermanentIDsForObjects:[NSArray arrayWithObjects:insertManagedObject, nil] error:&error]; //;
//check if its done
if (hasObtainedPermanentID && error == nil)
NSLog(@"After %@ : %d",insertManagedObject.objectID,insertManagedObject.objectID.isTemporaryID);
//check context has changes and is saved in context
if ([managedObjectContext hasChanges] && [managedObjectContext save:&error])
return insertManagedObject;
【讨论】:
以上是关于从 CoreData 获取最后插入的 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章
核心数据 - NSManagedObjectContext vs NSFetchedResultsController