Issue #4
Realm is great. But without primary key, it will duplicate the record, like https://github.com/realm/realm-java/issues/2730, http://stackoverflow.com/questions/32322460/should-i-define-the-primary-key-for-each-entity-in-realm, … So to force ourselves into the good habit of declaring primary key, we can leverage Swift protocol
Create primary constrain protocol like this
protocol PrimaryKeyAware {
var id: Int { get }
static func primaryKey() -> String?
}
and conform it in out Realm object
class Profile: Object, PrimaryKeyAware {
dynamic var firstName: String = ""
dynamic var lastName: String = ""
dynamic var id: Int = 0
override static func primaryKey() -> String? {
return "id"
}
}
This way, when using that object in out RealmStorage
, we are safe to say that it has a primary key
class RealmStorage<T: Object> where T: PrimaryKeyAware {
let realm: Realm
init(realm: Realm = RealmProvider.realm()) {
self.realm = realm
}
func save(_ objects: [T]) {
try? realm.write {
realm.add(objects, update: true)
}
}
}
The usage is like this
let profile = Profile()
let storage = RealmStorage<Profile>()
storage.save([profile])