2016-05-16 4 views
0

私のアプリケーションでCoreDataを使用しています。私は2つの属性を持つエンティティを作成しました。 1つはInt型で、2つ目はTransformable Typeです。私は自分のレコードを正常に保存することができます。しかし、私がフェッチしようとすると、クラッシュする。もう一つ、Transformable型を使用せずにすべてうまく動作しています。理由は何でしょうか?それは変形型ですか?それでは、解決策は何ですか?Swift 2.0のFetchRequestでクラッシュする

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

私は次のオブジェクトクラスをTransformable attirbuteに割り当てています。

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

デバッグコンソールにはどのようなエラーがありますか?あなたが墜落したときに(象徴的な!)スタックはどのように見えますか? –

+0

EXC_BAD_ACCESS。デバッグコンソールには何もありません。そして私はどこで象徴的なスタック見た目を得るのですか? – Rox

+0

transformable属性にどのような価値を割り当てていますか? 'NSCoding'に準拠していますか? –

答えて

0

私はちょうど戦い、戦い、最終的にそれを達成しました。私の解決策は次のとおりです。

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

誰も助けてくれることを願っています。他に解決策がある場合は、私に知らせてください。

関連する問題