从 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] 方法将记录保存在数据库中。 等等。您认为名为@9​​87654328@ 的方法不会永久化objectIDs?请解释一下。 @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的主要内容,如果未能解决你的问题,请参考以下文章

字符串的最后一部分未插入 coredata

核心数据 - NSManagedObjectContext vs NSFetchedResultsController

当应用程序处于后台时,从推送通知中插入 coredata 记录

从 CoreData 中获取比较和删除字符串

从最后插入的行获取最后插入 id

如何在 Core Data 中使用 swift 4 Codable?