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)
}
}
}
}
Welchen Fehler sehen Sie in der Debug-Konsole? Wie sieht der (symbolische!) Stack beim Absturz aus? –
EXC_BAD_ACCESS. Auf der Debug-Konsole gibt es nichts. Und wo bekomme ich symbolischen Stack Look? – Rox
Welche Art von Wert weisen Sie dem transformierbaren Attribut zu? Entspricht es "NSCoding"? –