どのような種類のデータベースですかレルム?それはORMですか?それともオブジェクトデータベースのように動作しますか?たぶん、データベース構造が何らかの形で設計プロセスに影響するでしょうか?レルムデータベースの設計には何かニュアンスはありますか?レルムはどのような種類のデータベースですか?
私は公式サイト内の任意の答えを見つけていないので、私は、ここで求めている
どのような種類のデータベースですかレルム?それはORMですか?それともオブジェクトデータベースのように動作しますか?たぶん、データベース構造が何らかの形で設計プロセスに影響するでしょうか?レルムデータベースの設計には何かニュアンスはありますか?レルムはどのような種類のデータベースですか?
私は公式サイト内の任意の答えを見つけていないので、私は、ここで求めている
残念ながら、私は実際にの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()
}
}
}
答えてくれてありがとうございましたが、データベースの内部機構やユースケースにもっと興味がありました – ilyailya
「Realmデータベースの設計には何かニュアンスがありますか?」と思っていましたが、REALM THREADING DEEP DIVE – EpicPandaForce
https://news.realm.io/news/threading-deep-dive/ – EpicPandaForce
このhttps://realm.io/news/realm-object-centric-present-day-database-mobile-applications/ –
これは、オブジェクトデータベースです参照してください。 –