gpt4 book ai didi

ios - Swift 2.0 中的 FetchRequest 崩溃

转载 作者:行者123 更新时间:2023-11-30 13:25:31 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com