[英]Core Data Retrieval Issue In Swift
我在检索核心数据时遇到问题(代码如下所示)。 我创建了一个新的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)
给我的输出:
可选([(实体:Users; id:0xd000000000040000;数据:{密码=通过;测试编号= 12345;用户名=标记;}),(实体:Users; id:0xd000000000080000;数据:{密码=通过; testnumbers = 12345;用户名=标记;}),(实体:用户; id:0xd0000000000c0000;数据:{密码=通过;测试号= 12345;用户名=标记;}]]))
实际的XCode屏幕截图:
您的问题是context.executeFetchRequest
返回一个AnyObject?
数组AnyObject?
。 当您遍历对象时是AnyObject?
,正如Xcode所说,它没有属性testnumber
, username
或password
。
为了解决这个问题并能够使用点符号访问属性,您需要为实体创建子类:
1.选择数据模型(.xcdatamodel文件),然后至少选择一个实体。 然后转到“编辑器->创建NSManagedObject子类...”,如图所示。
Xcode将带您创建子类。 (只需单击下一步,然后选择您要为其创建子类的所有实体-可能是所有实体)
2.现在,您将拥有用于托管对象的.m和.h文件。 在.h文件中,您应该看到每个属性和关系的属性。 您可以使用这些属性来访问存储在CoreData中的值。
注意- '创建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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.