将新对象插入数据库时​​出现Swift dynamicCast错误

Posted

技术标签:

【中文标题】将新对象插入数据库时​​出现Swift dynamicCast错误【英文标题】:Swift dynamicCast error while inserting new object to database 【发布时间】:2014-08-08 09:27:45 【问题描述】:

我有一本字典,里面有我想作为新对象插入数据库的所有数据。问题是当我尝试转换新创建的对象时,它给了我异常:

libswift_stdlib_core.dylib`swift_dynamicCast:

汇编代码的一部分。 我使用的代码是这样的:

    var group:Group  
    if (array.count == 0) 
        group = NSEntityDescription.insertNewObjectForEntityForName("Group", inManagedObjectContext:appDelegate.managedObjectContext) as Group

    

Group类的结构是这样的:

    @objc(Group)
    class Group:NSManagedObject

        @NSManaged var createDate:NSString
        @NSManaged var groupPictureUrl:NSString
        @NSManaged var groupTypeId:NSString
        @NSManaged var isDepartment:NSString
        @NSManaged var lastMessageRead:NSString
        @NSManaged var name:NSString
        @NSManaged var unreadMessageCount:NSString
        @NSManaged var groupId:NSString
        @NSManaged var lastSync:NSString

我还有一个名为 AppDataNSManagedObject 的子类,它与 Group 类具有相同的结构。在插入部分代码时,如果我用AppData 替换 Group,它可以工作,我可以插入到AppData 表中。正如我之前所说,它们具有相同的结构,但参数除外。但是当我尝试插入 Group 对象时,它给了我动态转换异常。我该如何解决这个问题?

【问题讨论】:

你有没有在强制转换之前检查过对象是否被创建(即有一个非 nil 指针)?也许“组”关键字有些奇怪...... 我阅读了几乎所有可以在 *** 上找到的答案。一些人声称添加 @objc(Group) 会起作用,但它对我不起作用。一些人声称在 Group 前面添加模块名称(来自实体检查器)会起作用。这对我也不起作用。我什至尝试了这两种方法的不同变体。但是在运行单元测试时,这些解决方案仍然对我不起作用。令人费解的是,简单地创建一个实体会如此具有挑战性。 【参考方案1】:

如果你从超类(NSManagedObject)实现初始化方法,我通过不同的方式初始化实体对象解决了这个问题,例如:(在 Group.swift 中)

    init(entity: NSEntityDescription!, insertIntoManagedObjectContext context: NSManagedObjectContext!) 
        super.init(entity: entity, insertIntoManagedObjectContext: context)
     

你可以像这样创建对象:

    var desc:NSEntityDescription = NSEntityDescription.entityForName("Group",inManagedObjectContext:appDelegate.managedObjectContext)
    var group:Group = Group(entity:desc, insertIntoManagedObjectContext: appDelegate.managedObjectContext)

我读过的大多数解决方案都是这样启动的:

  var group:Group = NSEntityDescription.insertNewObjectForEntityForName("Group", inManagedObjectContext:appDelegate.managedObjectContext) as Group

所以这是问题所在,无法使用这种方式将对象转换为自定义托管对象类。谢谢大家。

【讨论】:

此解决方案有效。但是每当我从 xcode 重新生成模型时,我都需要手动将 init() 添加回文件中。我希望苹果能解决这个问题。

以上是关于将新对象插入数据库时​​出现Swift dynamicCast错误的主要内容,如果未能解决你的问题,请参考以下文章

将新的核心数据对象插入到多个 NSOrderedSet 会忽略索引

将新对象保存在索引路径 Core Data

Swift - 将新的 UIWINdow 定位在屏幕中心

托管对象上下文不会保存——没有错误

如何在 Swift 中向实体插入新数据?

将新对象插入 coreData