2017-05-22 4 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"] 
    } 
} 

해당 값이 저장되지 않기 때문에 applicant 값이 표시되지 않는 값을 가져 오는 중 오류.

let applicants = List<ApplicantsEntity>() 

을 모두 클래스에 primaryKeys를 추가 :

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

이 두 가지를 변경해보십시오, 당신의 applicants 재산의 유형을 변경 : 여기에 생성 영역에 대한 내 노력 코드는

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

이것을 사용하면 매력처럼 작동하는이 선을 사용할 수 있습니다.

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

자세한 내용은 영역 설명서의 [이 부분] [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 } 
    } 
} 

을, 당신은 단순히이 작업을 수행 할 수 있습니다 : jsonResult 당신이 당신의 문제의 첫 번째 코드 단락에서 보여 JSON 출력입니다

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

.

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

미안하지만 여전히 데이터를 저장하는 데 문제가 있습니다. 'applicants = RLMArray 0x6080000fdd00>();' –

+1

과 같이 반환하는 신청자 값을 저장할 수 없습니다. * 수정 후 * 시도해보십시오. * 신청자는'List '로 신청할 것입니다. 이 객체를 직접 사용하는 것이 좋지만'Array (applicants)'를 캐스팅하여 "보통"Swift Array로 변환 할 수 있습니다. – pesch