2016-05-16 11 views
0

Ich verwende CoreData in meiner Anwendung. Ich habe eine Entität mit zwei Attributen erstellt. Einer ist der Int-Typ und der zweite ist der transformierbare Typ. Ich kann meine Aufzeichnung erfolgreich speichern. Aber wenn ich versuche zu holen, kommt es zum Absturz. Und noch eine Sache, alles funktioniert gut, ohne den transformierbaren Typ zu verwenden. Was könnte der Grund sein? Ist das ein veränderbarer Typ? Und wenn ja, was ist die Lösung?Absturz auf FetchRequest in Swift 2.0

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) 
    } 
} 

Ich zuweisen folgende Objektklasse zu transformierbare Attibute.

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) 
      } 
     } 
    } 
} 
+0

Welchen Fehler sehen Sie in der Debug-Konsole? Wie sieht der (symbolische!) Stack beim Absturz aus? –

+0

EXC_BAD_ACCESS. Auf der Debug-Konsole gibt es nichts. Und wo bekomme ich symbolischen Stack Look? – Rox

+0

Welche Art von Wert weisen Sie dem transformierbaren Attribut zu? Entspricht es "NSCoding"? –

Antwort

0

Ich kämpfe und kämpfe und habe es endlich geschafft. Hier ist meine Lösung:

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 
} 
} 
} 

Habe ich nur noch NSCoding in meiner Objektklasse. Und dann implementiert init() und encodeWithCode() Methoden. Danach habe ich NSKeyedArchiver und NSKeyedUnarchiver zum Speichern und Abrufen von Daten verwendet.

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) 
} 
} 

Ich hoffe, es wird jedem helfen. Wenn es eine andere Lösung gibt, lass es mich wissen.