我在我的应用程序中使用 CoreData。我创建了一个具有两个属性的实体。一种是 Int 类型,第二种是 Transformable 类型。我能够成功保存我的记录。但是当我尝试获取时,它崩溃了。另一件事是,在不使用 Transformable 类型的情况下一切都工作正常。可能是什么原因?是变形型吗?如果是,那么解决方案是什么?
func saveUserInfoInDatabase(userDetails: FleetInfoDetails) {
self.deleteUserInfoFromDatabase()
let entityDescription = NSEntityDescription.entityForName("UserInfo", inManagedObjectContext: self.userInfoObjectContext)
let data = UserInfo(entity: entityDescription!, insertIntoManagedObjectContext: self.userInfoObjectContext)
print(userDetails)
data.info = userDetails
data.sync = 1
do {
try self.userInfoObjectContext.save()
} catch {
fatalError("Failure to save context: \(error)")
}
}
func deleteUserInfoFromDatabase() {
let fetchRequest = NSFetchRequest(entityName: "UserInfo")
if #available(iOS 9.0, *) {
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try DatabaseManager.sharedInstance.persistentStoreCoordinator.executeRequest(deleteRequest, withContext: self.userInfoObjectContext)
do {
try self.userInfoObjectContext.save()
} catch {
let saveError = error as NSError
print(saveError)
}
} catch let error as NSError {
let saveError = error as NSError
print(saveError)
}
} else {
// Fallback on earlier versions
}
}
func fetchUserInfoFromDatabase(){
let request = NSFetchRequest(entityName: "UserInfo")
do {
let results = try self.userInfoObjectContext.executeFetchRequest(request) as? [UserInfo] //Getting crash here
if results!.count > 0 {
}else{
print("0 results or potential error")
}
} catch {
let saveError = error as NSError
print(saveError)
}
}
我将以下对象类分配给可变形属性。
class FleetInfoDetails: NSObject {
var fleetId: Int!
var fleetImage: String!
var accessToken: String!
var email: String!
var phone: String!
var password: String!
var name: String!
var teams: Array<AssignedTeamDetails>?
func encodeWithCoder(_aCoder: NSCoder) { }
func initWithCoder(aCode:NSCoder) {
}
init(json: NSDictionary) {
if let fleetId = json["fleet_id"] as? Int {
self.fleetId = fleetId
}
if let fleetImage = json["fleet_image"] as? String {
if fleetImage.isEmpty{
self.fleetImage = nil
}
self.fleetImage = fleetImage
}
if let accessToken = json["access_token"] as? String {
if accessToken.isEmpty{
self.accessToken = nil
}
self.accessToken = accessToken
}
if let email = json["email"] as? String {
if email.isEmpty{
self.email = nil
}
self.email = email
}
if let phone = json["phone"] as? String {
if phone.isEmpty{
self.phone = nil
}
self.phone = phone
}
if let password = json["password"] as? String {
if password.isEmpty{
self.password = nil
}
self.password = password
}
if let name = json["name"] as? String {
if name.isEmpty{
self.name = nil
}
self.name = name
}
if let items = json["teams"] as? NSArray{
if items.count == 0{
teams = [AssignedTeamDetails]()
} else {
teams = [AssignedTeamDetails]()
}
for item in items{
if let team = AssignedTeamDetails(json: item as! NSDictionary) as AssignedTeamDetails! {
teams?.append(team)
}
}
}
}
最佳答案
我不断地奋斗,终于实现了。这是我的解决方案:
class FleetInfoDetails: NSObject, NSCoding {
var fleetId: Int!
var accessToken: String!
required init(coder aDecoder: NSCoder) {
fleetId = aDecoder.decodeObjectForKey("fleetId") as! Int
accessToken = aDecoder.decodeObjectForKey("accessToken") as! String
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(fleetId, forKey: "fleetId")
aCoder.encodeObject(accessToken, forKey: "accessToken")
}
init(json: NSDictionary) {
if let fleetId = json["fleet_id"] as? Int {
self.fleetId = fleetId
}
if let accessToken = json["access_token"] as? String {
if accessToken.isEmpty{
self.accessToken = nil
}
self.accessToken = accessToken
}
}
}
我刚刚在我的对象类中添加了 NSCoding。然后实现所需的 init() 和encodeWithCode() 方法。之后我使用 NSKeyedArchiver 和 NSKeyedUnarchiver 来保存和获取数据。
func saveUserInfoInDatabase(userDetails: FleetInfoDetails) {
self.deleteUserInfoFromDatabase()
let entityDescription = NSEntityDescription.entityForName("UserInfo", inManagedObjectContext: self.userInfoObjectContext)
let data = UserInfo(entity: entityDescription!, insertIntoManagedObjectContext: self.userInfoObjectContext)
data.info = NSKeyedArchiver.archivedDataWithRootObject(userDetails)
data.sync = 1
do {
try self.userInfoObjectContext.save()
} catch {
fatalError("Failure to save context: \(error)")
}
}
func fetchUserInfoFromDatabase(){
let request = NSFetchRequest(entityName: "UserInfo")
do {
let results = try self.userInfoObjectContext.executeFetchRequest(request) as? [UserInfo]
if results!.count > 0 {
let userData = NSData(data: results?.first?.valueForKey("info") as! NSData)
let userDetails = NSKeyedUnarchiver.unarchiveObjectWithData(userData) as! FleetInfoDetails
}else{
print("0 results or potential error")
}
} catch {
let saveError = error as NSError
print(saveError)
}
}
希望对大家有帮助。如果还有其他解决方案请告诉我。
关于ios - Swift 2.0 中的 FetchRequest 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37253812/