我在检索核心数据时遇到问题(如下所示)。我创建了一个新的XCode项目和具有三个属性username
,password
和testnumbers
的数据模型。使用下面的代码我将值存储在其中,并将结果输出到日志(右下角是输出,来自注释掉的代码行println(results)
)。很明显,我已经正确地存储了所有内容。
现在我评论了该部分,现在想要检索username
,password
和testnumbers
下存储的值。代码打印result.password
似乎没问题,但在尝试打印result.testnumbers
和result.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截图:
答案 0 :(得分:1)
您的问题是context.executeFetchRequest
返回AnyObject?
数组。如果您正在循环浏览对象,则AnyObject?
正如Xcode所说,不具备testnumber
,username
或password
属性。< / p>
要解决此问题并且能够使用点表示法访问属性,您需要为enties创建子类:
1。选择您的数据模型(.xcdatamodel文件)并选择至少一个实体。然后转到&#39;编辑器 - &gt;创建NSManagedObject子类......&#39;如图所示。
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)
}