无法将 JSON 个对象映射到领域

Cannot map JSON objects to Realm

更新 2 我试图通过添加一个自动擦除脚本来处理迁移错误,但我被抛出一个错误

Expected declaration

更新 1

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

处收到此错误

fatal error: 'try!' expression unexpectedly raised an error

这是我的 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.")
        }

 }
 }
 }

旧Post

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

Cannot convert value of type '(Response)->()' to expected argument type 'Response->Void'

{
 "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"]
  }  
}

如错误消息所述,您的完成块需要采用 Response<AnyObject, NSError>,而不是 Response<Particulars, NSError>

为了回答您的更新,当您对 Realm 进行更改时,您需要卸载该应用程序并重新安装。这应该可以消除您的迁移错误。

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

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

然后,在您的 DataController class 中包含此 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)")
    }
}

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