I have a project which uses ObjectMapper for JSON serialization & deserialization and Realm to cache data locally. I get data from Rest API and save them into realm database properly I have checked with RealmStudio. The problem is when I retrieve data from database a property which is Object type returns nil! This is my class and foodFact is Object type which is nil when get FoodRecipe data from database.Any Ideas?
import RealmSwift
import ObjectMapper
typealias Syncable = Object & Mappable
class FoodFact: Syncable {
@objc dynamic var objectId :String = ""
@objc dynamic var calcium: String = ""
@objc dynamic var iron: String = ""
@objc dynamic var fiber: String = ""
@objc dynamic var fattyTransAcide: String = ""
override static func primaryKey() -> String? {
return "objectId"
}
required convenience init?(map: Map) { self.init() }
func mapping(map: Map) {
self.objectId <- map["objectId"]
self.calcium <- map["calcium"]
self.iron <- map["iron"]
self.fiber <- map["fiber"]
self.fattyTransAcide <- map["fattyTransAcide"]
}
}
class FoodRecipe: Syncable {
@objc dynamic var objectId :String = ""
@objc dynamic var title :String = ""
var ingredient = List<FoodRecipeIngredient>()
@objc dynamic var foodFact :FoodFact? //returns nil when retrieving data
override static func primaryKey() -> String? {
return "objectId"
}
required convenience init?(map: Map) { self.init() }
func mapping(map: Map) {
objectId <- map["objectId"]
title <- map["title"]
ingredient <- (map["ingredients"],ArrayTransform<FoodRecipeIngredient>())
foodFact <- map["foodFact"]
}
}
This is code I use for save & retrieve data :
import Foundation
import RealmSwift
protocol BaseDao {
associatedtype T: Object
func save(list:[T])
func save(object:T)
func get() -> [T]?
func delete(list:[T])
func deleteAll()
}
extension BaseDao {
func deleteAll(){
PersistenceManager().deleteDatabase()
}
}
class PersistenceManager {
let realm = try! Realm()
var notificationToken = NotificationToken()
func deleteObjects(objs:[Object]) {
do {
try realm.write({
realm.delete(objs)
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
func saveObjects(objs: [Object]) {
print("path for realm \(String(describing: realm.configuration.fileURL))")
do {
try realm.write({
realm.add(objs, update: true)
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
func saveObject(obj: Object) {
print("path for realm \(String(describing: realm.configuration.fileURL))")
do {
try realm.write({
realm.add(obj, update: true)
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
func getObjects(type: Object.Type) -> Results<Object>? {
return realm.objects(type)
}
func deleteDatabase() {
do {
try realm.write({
realm.deleteAll()
})
} catch let error {
assertionFailure(error.localizedDescription)
}
}
}
class FoodRecipeLocalPersistence :BaseDao {
typealias T = FoodRecipe
let persistenceManager :PersistenceManager
init(persistenceManager :PersistenceManager = PersistenceManager()) {
self.persistenceManager = persistenceManager
}
func save(list: [T]) {
self.persistenceManager.saveObjects(objs: list)
}
func save(object: T) {
self.persistenceManager.saveObject(obj: object)
}
func get() -> [T]? {
guard let data = persistenceManager.getObjects(type: T.self) else {
return nil
}
return Array(data) as? [T]
}
func delete(list: [T]) {
self.persistenceManager.deleteObjects(objs: list)
}
}
Update 1: After Further review I have realized I can retrieve FoodRecipe with all properties in FoodRecipePersistence but in my ViewModel FoodFact is nil! I am using RxSwift in my ViewModel below is code snippet:
Observable.combineLatest(selectedCategory, currentCategory, resultSelector: { (selectedCategory, currentCategory) in
switch currentCategory {
case .Food:
let category = selectedCategory as? FoodRecipeCategory
return foodRecipeLocalPersistence.get()?.filter{ $0.categoryId == category?.objectId }.map{$0} ?? []
case .Sport:
let category = selectedCategory as? ExerciseInstructionCategory
return exerciseInstructionLocalPersistence.get()?.filter{ $0.categoryId == category?.objectId }.map{$0} ?? []
}
}).asObservable().bind(to: self.shownList).disposed(by: disposeBag)
update 2: When I use
po foodRecipe.foodFact
foodFact is printed on console with all data and properties but when I put mouse on foodRecipe.foodFact inside the editor it shows nil!!!