Reputation: 1832
In my app I'm using realm to store and retrieve data's. Here is my API result. I need to store this values to realm database.
{
"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
}
],
}
]
}
Problem is I can able to store Parent Values like id,firm, specialisation_id,etc,.
But I not able to store values like applicants
details. Here is my tried code:
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"]
}
}
When Retriving values applicant
values are not appearing because those values are not stored. Here is my tried code for creating realm:
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)
}
Upvotes: 0
Views: 1186
Reputation: 1996
Try changing these 2 things, change the type of your applicants
property:
let applicants = List<ApplicantsEntity>()
and add primaryKeys to both classes:
class ApplicantsEntity: Object
{
dynamic var "id" = ""
...
override static func primaryKey() -> String? {
return "id"
}
}
With this you should be able to use this line that works like a charm:
realm.create(CaseAreaEntity.self, value: json, update: true)
Have a look at [this part][1] of Realm's documentation for more details.
EDIT:
You don't neead the ObjectMapper
. Try modifying your Object
subclasses like this:
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"
}
}
Then you can add an extension to create objects directly from the output of 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 }
}
}
With the classes and extension above, you can simply do this:
if let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as? [String: Any] {
try CaseAreaEntity.create(from: jsonResult)
}
Where jsonResult
is the json output you show in the first code paragraph in your question.
[1]: https://realm.io/docs/swift/latest/#json
Upvotes: 3