如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?

Posted

技术标签:

【中文标题】如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?【英文标题】:How to access NSManagedObject entity using objectID which is not saved yet in iOS? 【发布时间】:2016-03-18 11:26:43 【问题描述】:

我使用私有队列 MOC 创建了一个实体,并调用了performBlock() 来异步保存它。

假设我希望这个新创建的实体在其他上下文/MOC 中,所以我只有一种访问它的方法是使用对象 ID。 但是由于它是异步调用来保存实体,因此可能出现实体尚未保存的情况,我想在performBlock()之后立即访问它,但在其他上下文中。

在这种情况下如何访问它?

提前致谢!


更新

let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = mainThreadManagedObjectContext()

let newUser = Contact(nameStr: "name", moc: privateMOC)

这是我创建新实体的通用代码,例如:

init(nameStr: String,  moc:NSManagedObjectContext) 
        let mEntity = NSEntityDescription.entityForName("Contact", inManagedObjectContext: moc)
        super.init(entity: mEntity!, insertIntoManagedObjectContext: moc)
    name = nameStr

创建后,我立即保存为:

performBlock  () -> Void in
            do 
                try privateMOC.save()
            catch 
                fatalError("Error asynchronously saving private moc - \(errorMsg): \(error)")
            
        

//访问

let privateMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateMOC.parentContext = mainThreadManagedObjectContext()

let pred = NSPredicate(format: "name == %@", "name")
if let results = DatabaseInterface.sharedInstance.fetchEntityFromCollection("Contact", withPredicate: pred, moc: privateMOC) 
            if let user = results.last 
                return user as! Contact
            
        
else 
            DDLogWarn("No user found")
        

我没有得到任何用户,但是当我使用sqlitebrowser查看时,我可以看到这个新联系人保存在数据库中

请原谅我的代码缩进:(

【问题讨论】:

请出示您的代码 :) @kishor : 看看代码 【参考方案1】:

你问的是不可能的。

当您在一个上下文中创建托管对象时,它只存在于内存中,直到您保存更改。即使您使用对象 ID,其他托管对象上下文也无法访问它。其他上下文无法从持久存储文件中查找数据,也无法从其他上下文中获取数据。它根本无法获取对象。您需要等到保存完成。

您可以尝试以下几种方法,具体取决于您的应用的结构:

使用performBlockAndWait 而不是performBlock,这样您就会知道在块完成时保存已完成。 继续使用 performBlock,但将调用放在该块内,这会导致在不同的上下文中访问对象 - 通过在另一个上下文中的嵌套 performBlock 调用。

【讨论】:

感谢@tom!我使用“performBlockAndWait”同步保存数据库,效果很好

以上是关于如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何查找CDHDR/CDPOS表中的对象类(OBJECTCLAS)对象值(OBJECTID)

将猫鼬列从对象更改为 ObjectId

如何从存储在 Parse 列中的数组中删除对象

在 mongoose 中保存时使用 ObjectId 参考文档

如何使用 Java 中的 ObjectID 更新 MongoDB 中的文档

使用 ObjectId 保存文档的 PHP 正在转换为 Object->oid