无法将JSON对象映射到Realm

时间:2016-05-17 09:16:00

标签: ios swift2 realm alamofire swifty-json

更新2 我已经尝试通过添加自动擦除脚本来处理迁移错误,但我发现了错误

  

预期声明

Error thrown by adding script to App delegate

更新1

我已尝试将(response: Response<Particulars, NSError>)替换为(response: Response<AnyObject, NSError>),我在let realm = try! Realm()

收到此错误
  

致命错误:&#39;尝试!&#39;表达式意外地引发了错误

Fatal error thrown

这是我的POST请求:

import Foundation
import Alamofire
import SwiftyJSON
import RealmSwift
import ObjectMapper
import AlamofireObjectMapper


class Login {
init(userName: String, passWord: String) {
Data.sharedInstance.userName = userName
Data.sharedInstance.passWord = passWord
}
// call this method to login
func getRequest() {
Alamofire.request(.POST, Data.todoEndpoint, parameters: ["username": Data.sharedInstance.userName!, "password": Data.sharedInstance.passWord!])
    .responseJSON { (response: Response<AnyObject, NSError>) in
        if let result = response.result.value
        {
            let value = JSON(result)
               let realm = try! Realm()
               do{
                  try realm.write{
                      realm.add(result as! Object, update: true)
                                 }
                 }
                 catch let err as NSError {
                        print("Error with realm: " + err.localizedDescription)
                    }                        
        }
        else
        {
            print("JSON data is nil.")
        }

 }
 }
 }

旧帖子

我有一个JSON响应如下,我可以通过使用Alamofire的帖子请求获得。我现在想要使用AlamofireObjectMapper将我的数据映射到Realm中的数据库,但我被抛出此错误

  

无法转换类型的值&#39;(响应) - &gt;()&#39;预期   参数类型&#39;响应 - &gt; Void&#39;

Error thrown

{
 "name" : "Jonny Walker",
 "api_token" : "qwertyuiop1234567890",
 "profile_picture" : "http:default_profile_picture.jpg",
 "id" : 10,
 "email" : "jwalker@gmail.com"
 "username" : "jonny"
}

如何解决此问题?

这是我的POST请求

Alamofire.request(.POST, Data.todoEndpoint, parameters: ["username": Data.sharedInstance.userName!, "password": Data.sharedInstance.passWord!])
.responseJSON { (response: Response<Particulars, NSError>) in
  var errorFound = Bool()
  var errorMessage = String()
  if let result = response.result.value
  {
    let value = JSON(result)
    let realm = try! Realm()
    try! realm.write {
      for particular in result {
        realm.add(particular,update: true)
      }
    }
  }
}

这是我初始化我的Realm对象的地方

class Particulars: Object, Mappable {
  dynamic var name = ""
  dynamic var email = ""
  dynamic var id = 0
  dynamic var profilePicture = ""
  dynamic var username = ""
  dynamic var apiToken = ""
  override static func primaryKey() -> String? {
    return "id"
  }
  //Impl. of Mappable protocol
  required convenience init?(_ map: Map) {
    self.init()
  }
  func mapping(map: Map) {
    id    <- map["id"]
    name <- map["name"]
    email <- map["email"]
    profilePicture <- map["profile_picture"]
    username <- map["username"]
    apiToken <- map["api_token"]
  }  
}

3 个答案:

答案 0 :(得分:0)

正如错误消息所示,您的完成功能块需要Response<AnyObject, NSError>,而不是Response<Particulars, NSError>

答案 1 :(得分:0)

要回答您的更新,当您对Realm进行更改时,您需要卸载该应用并重新安装。这应该摆脱你的迁移错误。

答案 2 :(得分:0)

关于问题的第二部分,关于迁移错误。您之所以收到错误,是因为您已经更改了对象定义,并且它们不再与Realm数据库中存储的内容相匹配。您需要处理从一个版本到下一个版本的干净迁移。或者,如果您的数据只是缓存的服务器数据,并且不需要为用户保留,因为它可以重新创建(或者您处于调试/测试模式),您可以将其添加到您的AppDelegate(在使用Realm执行任何操作之前位于didFinishLaunchingWithOptions...的顶部):

    // Auto wipe Realm store if schema has changed
    do {
        let _ = try Realm()
    }
    catch {
        DataController.deleteRealmFilesAtPath(Realm.Configuration.defaultConfiguration.fileURL!)
    }

然后,在DataController课程中,添加此static方法:

static func deleteRealmFilesAtPath(fileURL: NSURL) {
    guard let path = fileURL.path else { return }
    let fileManager = NSFileManager.defaultManager()
    guard fileManager.fileExistsAtPath(path) else { return }

    do {
        try fileManager.removeItemAtPath(path)
        try fileManager.removeItemAtPath(path + ".lock")
        try fileManager.removeItemAtPath(path + ".note")
    }
    catch {
        print("Unable to delete Realm files: \(error)")
    }
}

如果架构已更改,这将擦除应用程序启动时的旧数据库文件。当然,你也会丢失任何数据,所以你只能在某些情况下使用它。