2017-02-20 12 views
1

どのような種類のデータベースですかレルム?それはORMですか?それともオブジェクトデータベースのように動作しますか?たぶん、データベース構造が何らかの形で設計プロセスに影響するでしょうか?レルムデータベースの設計には何かニュアンスはありますか?レルムはどのような種類のデータベースですか?

私は公式サイト内の任意の答えを見つけていないので、私は、ここで求めている

+0

このhttps://realm.io/news/realm-object-centric-present-day-database-mobile-applications/ –

+0

これは、オブジェクトデータベースです参照してください。 –

答えて

3

残念ながら、私は実際にのiOSバージョンを使用していないが、私は一日一日のAndroid版を、使用しませんiOSバージョンの機能セットでますます類似しており、同じcoreを共有しており、object-storeを介して同じ統一された動作を提供することに近づいています。

したがって、この回答のほとんどはSwift APIドキュメントに基づいています。 (レルムスイフト 2.6.1)


レルムは、デフォルトでオブジェクトストアです。技術的には今何レルムについて興味深いことは、それは、リレーショナルデータベースではないということです

// from https://realm.io/docs/swift/latest/#models 
class Person: Object { 
    dynamic var name = "" 
    dynamic var birthdate = NSDate(timeIntervalSince1970: 1) 
    let dogs = List<Dog>() 
} 

のように、スキーマはクラスによって定義されたスキーマにあなたのデータを格納します。オブジェクトを直接格納します。実際に、Realmによって管理されるオブジェクト(RealmへのクエリまたはRealmによって新しく作成されたオブジェクト)は、基礎となるRealmファイルに直接マップされ、データをフィールドにコピーしません。レルムファイル。

この「直接アクセス」の結果、すべてのデータがアクセスされたとき(遅延評価)のみロードされるため、管理対象オブジェクトのキャッシュは必要ありません(!)。

すべての書き込みはトランザクションです。トランザクションの外では、管理対象RealmObjectsは変更できません。彼らはあなたが "として定義できる、backlinkに対応している(多対一、)

// from https://realm.io/docs/swift/latest/#relationships 
class Dog: Object { 
    // ... other property declarations 
    dynamic var owner: Person? // to-one relationships must be optional 
} 

class Person: Object { 
    // ... other property declarations 
    let dogs = List<Dog>() // to-many relationship 
} 

どれ関係:あなたのオブジェクト間の


、あなたは関係(リンク)を持つことができますこのオブジェクトにリンクしているオブジェクト "を返します。

// from https://realm.io/docs/swift/latest/#relationships 
class Dog: Object { 
    dynamic var name = "" 
    dynamic var age = 0 
    let owners = LinkingObjects(fromType: Person.self, property: "dogs") 
} 

レルムの管理対象オブジェクトの場所に変異しれ、(hereから)「データのライブ、不変ビュー」であり、あなたは(hereから)notification tokenを経由して、それについての変更通知を受け取ります。 管理対象レルムオブジェクトでも同様ですが、でもクエリ結果はです。

意味、クエリ結果は自動的に非同期的に評価され、指定されたインデックスでアクセスされた要素のみが遅延ロードされてデータベースから読み込まれます。したがって、改ページは必要ありません。

スレッド上の書き込みは、実行ループに関連付けられたスレッドに自動的に通知を送信し、クエリ結果は自動的に更新され、変更リスナー(通知ブロック)が呼び出されます。

// from https://realm.io/docs/swift/latest/#collection-notifications 
    override func viewDidLoad() { 
    super.viewDidLoad() 
    let realm = try! Realm() 
    let results = realm.objects(Person.self).filter("age > 5") 

    // Observe Results Notifications 
    notificationToken = results.addNotificationBlock { [weak self] (changes: RealmCollectionChange) in 
     guard let tableView = self?.tableView else { return } 
     switch changes { 
     case .initial: 
     // Results are now populated and can be accessed without blocking the UI 
     tableView.reloadData() 
     break 
     case .update(_, let deletions, let insertions, let modifications): 
     // Query results have changed, so apply them to the UITableView 
     tableView.beginUpdates() 
     tableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }), 
          with: .automatic) 
     tableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}), 
          with: .automatic) 
     tableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }), 
          with: .automatic) 
     tableView.endUpdates() 
     break 
     case .error(let error): 
     // An error occurred while opening the Realm file on the background worker thread 
     fatalError("\(error)") 
     break 
     } 
    } 
    } 

    deinit { 
    notificationToken?.stop() 
    } 

最もよく知られている制限がRealmObjects、RealmResultsとレルムスレッドの間を通過することができないことです。 (その他の制限はhereです)。

特定のスレッドのRealmObject/RealmResults/Realmは、対応するRealmインスタンスが開かれたスレッド(アクセスhere)でのみアクセスできます。 (ただし、ThreadSafeReferenceを使用するスレッド間で送信されるRealmObjectsは、hereを参照してください)。

したがって、バックグラウンドスレッドは、通常、autoreleasepoolでラップされた独自のRealmインスタンスを必要とします。hereを参照してください。

// from https://realm.io/docs/swift/latest/#using-a-realm-across-threads 
DispatchQueue(label: "background").async { 
    autoreleasepool { 
    // Get realm and table instances for this thread 
    let realm = try! Realm() 

    // Break up the writing blocks into smaller portions 
    // by starting a new transaction 
    for idx1 in 0..<1000 { 
     realm.beginWrite() 

     // Add row via dictionary. Property order is ignored. 
     for idx2 in 0..<1000 { 
     realm.create(Person.self, value: [ 
      "name": "\(idx1)", 
      "birthdate": Date(timeIntervalSince1970: TimeInterval(idx2)) 
     ]) 
     } 

     // Commit the write transaction 
     // to make this data available to other threads 
     try! realm.commitWrite() 
    } 
    } 
} 
+0

答えてくれてありがとうございましたが、データベースの内部機構やユースケースにもっと興味がありました – ilyailya

+0

「Realmデータベースの設計には何かニュアンスがありますか?」と思っていましたが、REALM THREADING DEEP DIVE – EpicPandaForce

+0

https://news.realm.io/news/threading-deep-dive/ – EpicPandaForce

関連する問題