无法将 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)")
}
}
如果架构已更改,这将在应用启动时擦除旧数据库文件。当然,你也会丢失里面的任何数据,所以你只能在某些情况下使用它。
更新 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)")
}
}
如果架构已更改,这将在应用启动时擦除旧数据库文件。当然,你也会丢失里面的任何数据,所以你只能在某些情况下使用它。