ios - Swift 2.0 中的 FetchRequest 崩溃

标签 ios swift core-data executefetchrequest

我在我的应用程序中使用 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/

相关文章:

ios - iOS 11 中的 Apple Watch 上缺少通知图标

ios - 我的 UITableView 中没有显示任何数据

javascript - 从 WKWebView 获取 JSON 文本

ios - 在 didSet 之后观察 Swift Combine 中 @Published var 的变化?

iphone - 核心数据存储(sqlite)备份的最佳实践?

iphone - 为什么 didEnterRegion 调用了两次?

ios - 如何在运行时判断 iOS 应用程序是否正在通过 Crashlytics Beta 安装运行

ios - observeSingleEvent(:with:) fetching old data

ios - 无法使用核心数据 (Swift) 将数据保存/检索到设备

ios - 无法在 swift 2 中更新实体