【问题标题】:How to initialize a generated Core Data NSManagedObject in Swift如何在 Swift 中初始化生成的核心数据 NSManagedObject
【发布时间】:2015-05-30 18:12:09
【问题描述】:

我知道 obj-c,但我学得很快。

在 obj-c 中,当使用核心数据时,您对数据进行建模并告诉 xcode 生成模型的 nsmanageobject 子类。 然后在代码中将其初始化为

#import MyObject
- (void) someMethod
{
    MyObject *my = (Card *) [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:[self managedObjectContext]];

    my.name = @"some name";
}

我正在尝试做同样的事情,但我似乎无法弄清楚如何初始化我的自定义对象。 这就是我所拥有的:

生成的 NSManagedObject 子类:

导入基础 导入核心数据

class Card: NSManagedObject
{
    @NSManaged var card_name: String
    @NSManaged var card_id: String
    @NSManaged var card_issuer: String
    @NSManaged var card_type: String
}

然后我尝试在另一个类上使用它,像这样:

var card : Card
card.card_name = "Some Name"
card.card_issuer = "HOA"
card.card_type = "Rec Center"
card.card_id =  "123"

但我得到的错误是:

在初始化之前使用的变量“卡片”

我显然错过了一个步骤,但我无法指出它是什么。

此外,正如几位 iOS 讲师所提到的,您不应该混淆生成的 NSManagedObject 子类。

有什么建议吗?

编辑 我现在收到一个错误:(可能是一个新的 SO 问题...)

CoreData:警告:无法为实体“卡”加载名为“卡”的类。找不到类,改用默认的 NSManagedObject。

这里是显示这个类在构建阶段是如何存在的屏幕截图,并且实体名称已在 xcdatamodeld 文件中设置

谢谢

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    你有这个:

    var card : Card
    

    这声明cardCard 类型,但不创建实例。您需要在使用它之前分配和初始化一个实例。这里的初始化规则与 Objective-C 中的相同,即您必须在对象上调用指定的初始化程序。你会做这样的事情:

    var card = NSEntityDescription.insertNewObjectForEntityForName("Card", inManagedObjectContext: self.managedObjectContext) as! Card
    

    不管怎样,你的 Objective-C sn-p 是不正确的,因为 init 不是 NSManagedObject 的指定初始化器。

    【讨论】:

    • 1.我修复了 obj-c 初始化。 2.这种方法仍然使用KVC。我不想做“card.setValue(“HOA”,forKey:“card_issuer”)”。我想做“card.card_issuer = “HOA”。这可能在 swift 中实现吗?
    • 我不知道你为什么认为这需要 KVC。假设您的模型配置正确,这将创建一个Card 的实例,并且您可以调用 `Card 上存在的任何方法。
    • 对不起,我刚刚意识到你最后有“as Card”,你直接使用 EntityDescription 而不是我在 obj-c 上使用的 2 步。让我看看这是如何工作的。谢谢!
    • 奇怪,我不断收到“CoreData:警告:无法为实体 'Card' 加载名为 'Card' 的类。找不到类,改用默认的 NSManagedObject。”
    • 听起来Card 类不包含在您正在构建的目标中。
    【解决方案2】:

    您声明了变量card,但从未初始化它。

    您将需要 Core Data 上下文,然后您可以创建一个实例:

    let entity = NSEntityDescription.entityForName("Card", inManagedObjectContext: managedObjectContext)
    let card = Card(entity: entity!, insertIntoManagedObjectContext: managedObjectContext)
    

    这将在上下文中设置一个空的 Card 实例。保存上下文后,您的新卡片就会出现在商店中。

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 2012-05-12
      • 1970-01-01
      • 2012-05-09
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多