Core Data <故障> 使用一次后

Posted

技术标签:

【中文标题】Core Data <故障> 使用一次后【英文标题】:Core Data <Fault > after use one time 【发布时间】:2016-05-03 14:09:25 【问题描述】:

我搜索了几个小时,但没有找到任何东西

我在Core Data

中处于有线状态

获取对象的方法

func fetchAllCoreData() -> NSArray? 


    let moc = DataController().managedObjectContext
    let fetchReq = NSFetchRequest(entityName: "Theater")
    var array =  [Theater]()
    fetchReq.returnsObjectsAsFaults = false
    do 
        let obj = try moc.executeFetchRequest(fetchReq) as!  [Theater]
        for var details in obj 


            array.append(details)
        

     catch 
        print("Error in Fetching")
        return nil
    

    return array

其中 DataController() 来自http://www.codebeaulieu.com/10/adding-core-data-using-swift-2

我从 fetch 得到值

 po print(self.arrTheater)

[(实体:剧院;ID:0x7bf67a00;数据: 地址=伊斯康; 城市 = 艾哈迈达巴德; ID = 1; isFav = 1; 名称 = PVR; ), (实体: 剧院; id: 0x7bf5ee60 ; 数据: 地址=“普拉德纳加尔”; 城市 = 艾哈迈达巴德; ID = 2; isFav = 0; 名称 = 电影院; ), (实体: 剧院; id: 0x7bf5ee70 ; 数据: 地址 = "新地址"; 城市=拉杰科特; ID = 3; isFav = 0; name = "蓝色游戏"; ), (实体: 剧院; id: 0x7bf5ee80 ; 数据: 地址=“新伊斯康”; 城市 = 波尔班达尔; ID = 4; isFav = 1; 名称 = JaiHind; ), (实体: 剧院; id: 0x7bf55120 ; 数据: 地址=“新地址”; 城市=孟买; ID = 5; isFav = 0; 名称=“戏剧”; ), (实体: 剧院; id: 0x7bf55130 ; 数据: 地址=“维杰4路”; 城市 = 艾哈迈达巴德; ID = 6; isFav = 1; 名称 = PVR; ), (实体: 剧院; id: 0x7bf55140 ; 数据: 地址=“马哈维尔纳加尔”; 城市=德里; ID = 7; isFav = 0; 名称 = 电影院; ), (实体: 剧院; id: 0x7bf28570 ; 数据: 地址=伊斯康; 城市 = 艾哈迈达巴德; ID = 8; isFav = 0; name = "广角"; )]

这个方法是从 viewDidLoad 调用的 之后我重新加载 tableview

Tableview cellForRow 中没有任何内容

为标题标签设置值的一行 一切都很好

然后在我只是滚动 tableview 或选择 tableview 之后

然后我打印

FAULT 作为数据值

我阅读了理论,发现它只是占位符,但我无法获取它

请帮助我为什么它第一次显示数据然后显示故障

我已经fetchReq.returnsObjectsAsFaults = false

提前致谢

【问题讨论】:

【参考方案1】:

通常不需要担心故障(CoreData 会在您访问其任何属性时自动触发故障并填充对象)。

但在这种情况下,我怀疑正在发生更邪恶的事情:DataController 在该 fetchAllCoreData 方法中本地实例化,我担心一旦该方法被释放(连同相关的 managedObjectContext)完成。因此,您的返回数组包含来自已被释放的上下文的 NSManagedObjects。要检查,请尝试将 moc 设为属性而不是局部变量。这应该足以保持对上下文的永久引用(这反过来将对底层堆栈具有强引用)并防止它被释放。

从长远来看,您应该考虑为 DataController 本身设置一个属性,并将其设为单例以便您可以从任何视图控制器访问它,或者将其从视图控制器传递到视图控制器。

【讨论】:

【参考方案2】:

我遇到了同样的问题。我正在从数据库中获取数据(并将其保存到本地数组),然后填充一个表。几秒钟后,如果我点击任何内容,应用程序就会崩溃。到那时所有的 NSManagedObjects 都出现了故障。

问题是,我在成功响应之间和之间调用了一个 api,我正在删除数据库中的所有对象并从 api 响应中添加新内容。由于 NSManagedObjects 是动态呈现的,因此我用来填充表的本地数组中的旧数据出现故障。

如果有人遇到此类问题,请先尝试设置:

urRequest.returnsObjectsAsFaults = false 

如果这没有帮助,只需检查您是否正在修改数据库(即,在第一次获取之后)。

【讨论】:

取数据到数组后检查是否修改数据库即可。 fetchReq.returnsObjectsAsFaults = false 通过设置解决

以上是关于Core Data <故障> 使用一次后的主要内容,如果未能解决你的问题,请参考以下文章

iPhone Core Data 关系故障

从内存存储中删除 Core Data 对象会将它们变成故障,但不会擦除它们

使用 Core Data 对数据进行制表 - 如何有效过滤?

Core Data 没有第一次保存

Core Data一对多记录插入错误

如何避免 NSXMLParser 中重复的 Core Data 元素?