CoreData insertNewObjectForEntityForName 导致崩溃

Posted

技术标签:

【中文标题】CoreData insertNewObjectForEntityForName 导致崩溃【英文标题】:CoreData insertNewObjectForEntityForName Causing Crash 【发布时间】:2015-05-26 02:34:40 【问题描述】:

我一直在寻找一个错误,但我无法弄清楚。我有一个类,它需要一堆解析的数据,然后调用一个方法来为从解析的数据创建的每个元素创建新的核心数据“Article”对象。我已经展示了如何在下面声明 NSManagedObjectContext。

你还会看到方法

Article.createFLOArticleWithStructure(element, inManagedObjectContext: self.articleContext)

我将此方法放在扩展中以清理代码。该方法如下所示。

import Foundation

class FLODataHandler : NSObject, FLOConnectionHandlerDelegate, FLOParserHandlerDelegate, TriathleteParserHandlerDelegate, VeloNewsParserHandlerDelegate, CyclingNewsParserHandlerDelegate, RoadBikeActionParserHandlerDelegate, IronmanParserHandlerDelegate

    let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    lazy var articleContext: NSManagedObjectContext = self.appDelegate.managedObjectContext!

    func floParserHandlerDidFinishParsing(parserHandler : FLOParserHandler)
    
        for element in self.floParserHandler!.XMLParsedDataArray!
        
            // The pubDate, tilte and link and indicator have been added to the titleLinkArray.  I will now add the data to a Core Data Entity
            // in the Article+NewsFeedArticle class.
            Article.createFLOArticleWithStructure(element, inManagedObjectContext: self.articleContext)
        
    

分机代码

extension Article

    class func createFLOArticleWithStructure(articleStructure: DateTitleLink, inManagedObjectContext context: NSManagedObjectContext) -> (Article)
    
        // Core data is much simpler in Swift.  I have not commented this code since I do not know if it's working yet.

        var article = Article()

        //var entity = NSEntityDescription("Article", inManagedObjectContext: context)
        let fetchRequest = NSFetchRequest(entityName: "Article")
        let predicate = NSPredicate(format: "feed == 'FLO Cycling' AND title == %@", articleStructure.title!)
        let sortDescriptor = NSSortDescriptor(key: "pubDate", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]

        // Set up NSError
        var fetchError : NSError?
        // When you perform a fetch the returned object is an array of the Atricle Entities.
        let fetchedObjects = context.executeFetchRequest(fetchRequest, error: &fetchError) as! [Article]

        if fetchedObjects.count > 1
        
            println("Error! in Article+NewFeedArticle.swift")
        
        else if fetchedObjects.count == 0
        
            article = NSEntityDescription.insertNewObjectForEntityForName("Article", inManagedObjectContext: context) as! Article
            article.feed = "FLO Cycling"
            article.pubDate = articleStructure.date!
            article.title = articleStructure.title!
            article.link = articleStructure.link!
            article.theNewArticle = NSNumber(int: 1)

            var error : NSError?
            if(context.save(&error))
            
                println(error!.localizedDescription)
            
        
        else if fetchedObjects.count == 1
        
            article = fetchedObjects[fetchedObjects.endIndex - 1]
        

        return article
    

当我运行代码时,我在扩展代码的下一行停止并收到以下错误。

article = NSEntityDescription.insertNewObjectForEntityForName("Article", inManagedObjectContext: context) as! Article

CoreData:错误:无法调用指定的初始化程序 NSManagedObject 类 'FLOCycling1_1_1.Article' CoreData:警告: 无法为实体“文章”加载名为“文章”的类。不上课 找到,改为使用默认的 NSManagedObject。无法转换的值 键入“NSManagedObject_Article_”(0x7fe59c3515e0)到 'FLOCycling1_1_1.Article' (0x106139f70)。

我在网上阅读了有关在数据模型中使用前缀的信息。我添加了这个无济于事。如果您知道如何解决此错误,我将不胜感激。

添加****

这是应要求提供的 Article.swift 文件。

import Foundation
import CoreData

@objc class Article: NSManagedObject

    @NSManaged var feed: String
    @NSManaged var link: String
    @NSManaged var pubDate: NSDate
    @NSManaged var theNewArticle: NSNumber
    @NSManaged var title: String

保重,

乔恩

【问题讨论】:

你能告诉我们你的class Article 并确认它是你的目标的一部分吗? 目标是指它包含在“构建阶段”下的“编译源”中吗? 我刚刚注意到 CoreData.framework 不包含在项目中。我使用了千篇一律的核心数据模板。我必须自己添加吗? 我添加了 CoreData.framework,但这并没有解决问题。仅供参考。 【参考方案1】:

问题与我在此行中声明的文章有关。

var article = Article()

在 Swift 版本中,调用上述代码行会为文章分配和初始化内存。在我的代码的 Objective-C 版本中,我调用了以下代码。

Article *article = nil;

虽然我不确定为什么,但分配和初始化文章是问题所在。我在这里发现了这个关于类似错误的帖子。

Failed to call designated initializer on NSManagedObject class 'ClassName'

为了解决这个问题,我将代码更改为

var article = Article?()

为了清楚起见,我还将 Article 类更改为 ProjectName.Article。

我希望这对其他人有所帮助。

保重,

乔恩

【讨论】:

您使用哪个版本的 Xcode(我使用 Xcode 7 beta)?我遇到了类似的问题,但是当我尝试将 Article 类更改为 ProjectName.Article 时,它​​会立即删除句点以便显示 ProjectNameArticle? 我正在使用当前版本的 Xcode。我不记得发布此问题时使用的是什么。

以上是关于CoreData insertNewObjectForEntityForName 导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

CoreData与CloudKit同步时将图像保存到CoreData?

RestKit + CoreData:从CoreData缓存中排除某些对象

Coredata — 入门使用

认识CoreData—初识CoreData

Coredata 单表简单使用

iOS CoreData