2017-05-22 67 views
0

在我的應用程序中,我使用領域來存儲和檢索數據。這是我的API結果。我需要將這些值存儲到領域數據庫。iOS Swift 3將值存儲到領域

{ 
    "cc": [ 
    { 
     "id": 142, 
     "firm": 2, 
     "specialization_id": 2, 
     "specialization_name": "Alternative", 
     "number": "234", 
     "title": "Push test", 
     "ear": "2012", 
     "description": "", 
     "status": "Open", 
     "open_date": "2017-05-22", 
     "close_date": null, 
     "closing_comments": null, 
     "type_id": 99, 
     "type_name": "Tax Reference", 
     "record_id": 57, 
     "record_name": "Court of India", 
     "type": "Court", 
     "other_party": [], 
     "billing_type": "Retainer", 
     "applicants": [ 
     { 
      "type": "Contact", 
      "id": 31816, 
      "name": "1.Mrs V.Dhanalakshmi & Another", 
      "email": null, 
      "firm_id": 2, 
      "company_id": null, 
      "has_portal_access": false, 
      "mobile_number": null, 
      "street_address": null, 
      "locality": null, 
      "city": null, 
      "state": null, 
      "postal_code": null, 
      "landmark": null 
     } 
     ], 
    } 
    ] 
} 

問題是,我可以能夠存儲父值一樣id,firm, specialisation_id,etc,.但我不能夠存儲像applicants細節值。這是我試過的代碼:

import UIKit 
import RealmSwift 
import Realm 
import ObjectMapper 

class CaseResponseData: Mappable 
{ 
    var data:[CaseAreaEntity]? 

    //Impl. of Mappable protocol 
    required convenience init?(map: Map) 
    { 
     self.init() 
    } 

    func mapping(map: Map) 
    { 
     data <- map["court_case"] 
    } 
} 

//Case Details 
class CaseAreaEntity:Object, Mappable 
{ 
    dynamic var id = 0 
    dynamic var firm_id = 0 
    dynamic var specialization_id = 0 
    dynamic var specialization_name = "" 
    dynamic var number = "" 
    dynamic var title = "" 
    dynamic var case_year = "" 
    dynamic var description2 = "" 
    dynamic var status = "" 
    dynamic var open_date = "" 
    dynamic var close_date = "" 
    dynamic var closing_comments = "" 
    dynamic var case_type_id = 0 
    dynamic var case_type_name = "" 
    dynamic var court_record_id = 0 
    dynamic var court_record_name = "" 
    dynamic var court_type = "" 
    dynamic var client_type = "" 
    dynamic var billing_type = "" 
    dynamic var referred_by = "" 
    var applicants = List<ApplicantsEntity>() 


    //Impl. of Mappable protocol 
    required convenience init?(map: Map) 
    { 
     self.init() 
    } 

    override static func primaryKey() -> String? 
    { 
     return "id" 
    } 


    func mapping(map: Map) 
    { 
     id <- map["id"] 
     firm_id <- map["firm_id"] 
     specialization_id <- map["specialization_id"] 
     specialization_name <- map["specialization_name"] 
     number <- map["number"] 
     title <- map["title"] 
     case_year <- map["case_year"] 
     description2 <- map["description"] 
     status <- map["status"] 
     open_date <- map["open_date"] 
     close_date <- map["close_date"] 
     closing_comments <- map["closing_comments"] 
     case_type_id <- map["case_type_id"] 
     case_type_name <- map["case_type_name"] 
     court_record_id <- map["court_record_id"] 
     court_record_name <- map["court_record_name"] 
     court_type <- map["court_type"] 
     client_type <- map["client_type"] 
     billing_type <- map["billing_type"] 
     referred_by <- map["referred_by"] 
     applicants <- map["applicants"] 
    } 
} 
//Applicants Details 
class ApplicantsEntity: Object,Mappable 
{ 
    dynamic var applicant_id = 0 
    dynamic var applicantable_type = "" 
    dynamic var id = 0 
    dynamic var name = "" 
    dynamic var first_name = "" 
    dynamic var last_name = "" 
    dynamic var email = "" 
    dynamic var firm_id = 0 
    dynamic var company_id = 0 
    dynamic var has_portal_access = Bool() 
    dynamic var mobile_number = "" 
    dynamic var phone_number = "" 
    dynamic var fax = "" 
    dynamic var website = "" 
    dynamic var street_address = "" 
    dynamic var locality = "" 
    dynamic var city = "" 
    dynamic var state = "" 
    dynamic var postal_code = "" 
    dynamic var landmark = "" 

    //Impl. of Mappable protocol 
    required convenience init?(map: Map) 
    { 
     self.init() 
    } 

    override static func primaryKey() -> String? 
    { 
     return "id" 
    } 

    func mapping(map: Map) 
    { 
     applicant_id <- map["applicant_id"] 
     applicantable_type <- map["applicantable_type"] 
     id <- map["id"] 
     name <- map["name"] 
     first_name <- map["first_name"] 
     last_name <- map["last_name"] 
     email <- map["email"] 
     firm_id <- map["firm_id"] 
     company_id <- map["company_id"] 
     has_portal_access <- map["has_portal_access"] 
     mobile_number <- map["mobile_number"] 
     phone_number <- map["phone_number"] 
     fax <- map["fax"] 
     website <- map["website"] 
     street_address <- map["street_address"] 
     locality <- map["locality"] 
     city <- map["city"] 
     state <- map["state"] 
     postal_code <- map["postal_code"] 
     landmark <- map["landmark"] 
    } 
} 

當Retriving值applicant值沒有出現,因爲不使用這些存儲的值。這是我試圖創建境界代碼:

let JSON = response.result.value 
let realm:Realm = try! Realm() 
let resData = Mapper<CaseResponseData>().map(JSONObject: JSON)     
try! realm.write 
{ 
    realm.delete(realm.objects(CaseAreaEntity.self)) 
    realm.add((resData?.data!)!, update: true) 
    //realm.create(CaseAreaEntity.self, value: (resData?.data!)!, update: true) 
} 
+0

什麼是您看到的確切錯誤或您遇到的問題。如果你詳細說明確切的問題是什麼,這將有所幫助。 – Aaron

+0

@Aaron我沒有得到任何錯誤,但申請人的價值不存儲 –

回答

3

嘗試改變這2個東西,改變類型的applicants屬性:

let applicants = List<ApplicantsEntity>() 

,並添加primaryKeys兩個類:

class ApplicantsEntity: Object 
{ 
    dynamic var "id" = "" 
    ... 
    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

有了這個,你應該可以使用這條線條,就像一個魅力:

realm.create(CaseAreaEntity.self, value: json, update: true) 

查看Realm文檔的[this part] [1]以獲取更多詳細信息。編輯: 你不需要ObjectMapper。試着改變你的Object子是這樣的:

import RealmSwift 

class CaseAreaEntity: Object { 
    dynamic var id = 0 
    dynamic var firm_id = 0 
    dynamic var specialization_id = 0 
    dynamic var specialization_name = "" 
    dynamic var number = "" 
    dynamic var title = "" 
    dynamic var case_year = "" 
    dynamic var description2 = "" 
    dynamic var status = "" 
    dynamic var open_date = "" 
    dynamic var close_date = "" 
    dynamic var closing_comments = "" 
    dynamic var case_type_id = 0 
    dynamic var case_type_name = "" 
    dynamic var court_record_id = 0 
    dynamic var court_record_name = "" 
    dynamic var court_type = "" 
    dynamic var client_type = "" 
    dynamic var billing_type = "" 
    dynamic var referred_by = "" 
    var applicants = List<ApplicantsEntity>() 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

class ApplicantsEntity: Object { 
    dynamic var applicant_id = 0 
    dynamic var applicantable_type = "" 
    dynamic var id = 0 
    dynamic var name = "" 
    dynamic var first_name = "" 
    dynamic var last_name = "" 
    dynamic var email = "" 
    dynamic var firm_id = 0 
    dynamic var company_id = 0 
    dynamic var has_portal_access = Bool() 
    dynamic var mobile_number = "" 
    dynamic var phone_number = "" 
    dynamic var fax = "" 
    dynamic var website = "" 
    dynamic var street_address = "" 
    dynamic var locality = "" 
    dynamic var city = "" 
    dynamic var state = "" 
    dynamic var postal_code = "" 
    dynamic var landmark = "" 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

然後你就可以添加擴展直接從try JSONSerialization.jsonObject(with:, options:)輸出創建對象:

import RealmSwift 

extension CaseAreaEntity { 
    class func create(from jsonResponse: [String: Any]) throws { 
     do { 
      let realm = try Realm() 
      if let jsonCc = jsonResponse["cc"] as? [[String: Any]] { 
       try realm.write { 
        for json in jsonCc { 
         realm.create(CaseAreaEntity.self, value: json, update: true) 
        } 
       } 
      } 
     } catch { throw error } 
    } 
} 

隨着等級及以上的擴展,你可以簡單地這樣做:

if let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [String: Any] { 
     try CaseAreaEntity.create(from: jsonResult) 
} 

哪裏jsonResult是你在你的問題的第一個代碼段顯示JSON輸出。

[1]: https://realm.io/docs/swift/latest/#json 
+0

對不起,我仍然有問題,存儲數據的。我無法存儲應用程序的值,例如'applicants = RLMArray 0x6080000fdd00>();' –

+1

如果您在嘗試之後建議編輯:*您將以'List 的身份獲得申請人。我會建議直接使用這個對象,但是你可以通過強制轉換Array(applicants)來將它轉換成一個「正常的」Swift數組 – pesch