我已经在一个新的基于 Swift 的应用程序(当前是 XCode 6 beta 3)中成功设置了 RestKit 到 CoreData 的映射实现。我知道导入映射正在通过我的 RestKit JSON 调用进行工作,因为我可以检查 sqlite 数据库并查看我的数据。但是,我无法从 NSFetchRequest 中的数据存储中取回数据。我究竟做错了什么?
我将省略所有 RestKit 设置和拆卸,因为它非常标准并且看起来运行良好。所以这是我的 AppDelegate 查询代码,它似乎不起作用:
var currentUser: User? {
if !_currentUser {
var error: NSError? = nil
let request = NSFetchRequest(entityName: "User")
let recordCount = self.managedObjectContext.countForFetchRequest(request, error:&error)
NSLog("user records found: \(recordCount)")
var result = self.managedObjectContext.executeFetchRequest(request, error:&error)
for resultItem : AnyObject in result {
_currentUser = resultItem as? User
if _currentUser {
NSLog("Fetched User for \(_currentUser!.firstname) \(_currentUser!.lastname)")
}
}
}
return _currentUser;
}
self.managedObjectContext 从我的 AppDelegate 引用它,以从 RestKit shareObject 获取上下文:
var managedObjectContext: NSManagedObjectContext {
return RKObjectManager.sharedManager().managedObjectStore.mainQueueManagedObjectContext
}
看起来 fetch 请求成功,因为 for/in 循环中出现了断点。然而,当我检查 resultItem 或 _currentUser 对象时,它们显示为空,并且“if _currentUser”NSLog 永远不会触发。
有任何想法吗?我是否对 Swift 中获取数据做出了错误的假设?
EDIT 2:
问题源于我尝试将 resultItem 放入可选值中。如果声明 _currentUser 时不带可选参数并删除 as?可选强制转换查询返回正确的 User 对象:
for resultItem : AnyObject in result {
_currentUser = resultItem as User
NSLog("Fetched User for \(_currentUser.firstname) \(_currentUser.lastname)")
}
编辑:
我在主提取请求之前添加了记录计数,它正确显示了 1 条记录。因此,我尝试将获取结果映射到我的用户对象的方式出现了问题。这是我的用户类别:
import Foundation
import CoreData
class User: NSManagedObject {
@NSManaged
var id: Int32
@NSManaged
var createdAt: NSDate
@NSManaged
var udpatedAt: NSDate
@NSManaged
var username: String
@NSManaged
var email: String
@NSManaged
var firstname: String
@NSManaged
var lastname: String
@NSManaged
var organization: String
@NSManaged
var tokens: NSArray
}