DEV Community

Khoa Pham
Khoa Pham

Posted on

 

Primary key in Realm

Original post https://github.com/onmyway133/blog/issues/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?
}
Enter fullscreen mode Exit fullscreen mode

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"
  }
}
Enter fullscreen mode Exit fullscreen mode

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)
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

The usage is like this

let profile = Profile()
let storage = RealmStorage<Profile>()
storage.save([profile])
Enter fullscreen mode Exit fullscreen mode

Top comments (0)

An Animated Guide to Node.js Event Loop

Node.js doesnโ€™t stop from running other operations because of Libuv, a C++ library responsible for the event loop and asynchronously handling tasks such as network requests, DNS resolution, file system operations, data encryption, etc.

What happens under the hood when Node.js works on tasks such as database queries? We will explore it by following this piece of code step by step.