Swift中的核心数据检索问题

时间:2015-04-06 13:26:49

标签: ios xcode swift core-data

我在检索核心数据时遇到问题(如下所示)。我创建了一个新的XCode项目和具有三个属性usernamepasswordtestnumbers的数据模型。使用下面的代码我将值存储在其中,并将结果输出到日志(右下角是输出,来自注释掉的代码行println(results))。很明显,我已经正确地存储了所有内容。

现在我评论了该部分,现在想要检索usernamepasswordtestnumbers下存储的值。代码打印result.password似乎没问题,但在尝试打印result.testnumbersresult.username的代码中,它表示"' AnyObject'没有名为' testnumbers / username'"的成员。我不确定发生了什么,因为我之前的输出显示了正确的存储。

我尝试过多次重做这个简单的项目,总是首先创建数据模型并确保所有内容拼写正确等等。同样的事情不断发生。

以下是代码:

import UIKit
import CoreData

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        var appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        var context:NSManagedObjectContext = appDel.managedObjectContext!     

        var newUser = NSEntityDescription.insertNewObjectForEntityForName("Users",
                      inManagedObjectContext: context) as NSManagedObject   

        newUser.setValue("Mark", forKey: "username")
        newUser.setValue("pass", forKey: "password")
        newUser.setValue("12345", forKey: "testnumbers")
        context.save(nil) 

        var request = NSFetchRequest(entityName: "Users")
        request.returnsObjectsAsFaults = false
        var results = context.executeFetchRequest(request, error: nil)

        if results?.count > 0 {
            for result: AnyObject in results! {
                //println(results) // this printed everything fine
                println(result.password)
                println(result.testnumbers)
                println(result.username)
            }
        }
    }
}

以下是println(results)首先给出的内容的输出:

  

可选([(实体:用户; ID:   0xd000000000040000    ;数据:{      密码=通过;      testnumbers = 12345;      username = Mark; }),(entity:Users; id:0xd000000000080000    ;数据:{      密码=通过;      testnumbers = 12345;      username = Mark; }),(entity:Users; id:0xd0000000000c0000    ;数据:{      密码=通过;      testnumbers = 12345;      username = Mark; })])

实际XCode截图:

Actual XCode screenshot

1 个答案:

答案 0 :(得分:1)

您的问题是context.executeFetchRequest返回AnyObject?数组。如果您正在循环浏览对象,则AnyObject?正如Xcode所说,不具备testnumberusernamepassword属性。< / p>

要解决此问题并且能够使用点表示法访问属性,您需要为enties创建子类:

1。选择您的数据模型(.xcdatamodel文件)并选择至少一个实体。然后转到&#39;编辑器 - &gt;创建NSManagedObject子类......&#39;如图所示。

enter image description here

Xcode将指导您创建子类。 (只需单击下一步,然后选择要为其创建子类的所有实体 - 可能是所有实体)

2。现在您的托管对象拥有.m和.h文件。在.h文件中,您应该看到每个属性和关系的属性。您可以使用这些属性来访问存储在CoreData中的值。

注意 - &#39;创建ManagedObject子类;创建Objective-C文件,因此.h和.m。由于您使用的是Swift,因此您需要在。桥接标头中包含.h文件,例如#include "User.h"。如果您还没有桥接头,Xcode应该询问您是否要创建一个。否则,请查看此链接:https://bohemianpolymorph.wordpress.com/2014/07/11/manually-adding-a-swift-bridging-header/

3。现在,当您使用context.executeFetchRequest并获取对象时,您应该将它们转换为您期望的任何对象,然后您就可以访问它们的属性。这是一个例子:

let results = context.executeFetchRequest(request, nil)
if let user = results.first? as? User { // User is an NSManagedObject Subclass
    // Now you can access the properties, e.g:
    println(user.username)
}