現在私はこれを使用しています:
var matchedUsersFromRealm = MatchedUser.allObjects()
var matchedUsersInRealm = RLMArray(objectClassName: MatchedUser.className())
matchedUsersInRealm.removeAllObjects()
matchedUsersInRealm.addObjects(matchedUsersFromRealm)
しかし、それを1行にまとめるだけでなく、面倒に見えるだけです(またはそうしましたか?)。たぶんもっと良い方法がありますか?
PS、私はミックスプロジェクトに取り組んでいますが、どういうわけか、Objective-Cバージョンのみを使用して、それを自分のSwiftプロジェクトにブリッジできます。したがって、Realm()。objects()は使用できません。配列ではなく結果を返しますが。
これらの拡張機能を追加できます。
import Foundation
import RealmSwift
extension Results {
func toArray() -> [T] {
return self.map{$0}
}
}
extension RealmSwift.List {
func toArray() -> [T] {
return self.map{$0}
}
}
そして、フェッチするとき:
do {
let realm = try Realm()
let objs = realm.objects(MyObjType).toArray()
// ...
} catch _ {
// ...
}
(Swift 2.0より前)を使用している場合は、do trycatchを削除してください)
これにより、すべてが一度にメモリにロードされることに注意してください。これは、望ましくない場合もあります。ただし、バックグラウンドでフェッチする場合は、Realmがその後のメインスレッドでのオブジェクトの使用をサポートしていないため、必須です(この場合、配列を非Realmオブジェクトにマップする必要もあります)。
Genericsを使用してあらゆるタイプのオブジェクトを保存および取得するために、ヘルパークラスを追加することを好みました。
class RealmHelper {
static func saveObject<T:Object>(object: T) {
let realm = try! Realm()
try! realm.write {
realm.add(object)
}
}
static func getObjects<T:Object>()->[T] {
let realm = try! Realm()
let realmResults = realm.objects(T.self)
return Array(realmResults)
}
static func getObjects<T:Object>(filter:String)->[T] {
let realm = try! Realm()
let realmResults = realm.objects(T.self).filter(filter)
return Array(realmResults)
}
}
ユーザーのすべてのオブジェクトを1行で取得できます。
let matchedUsers = Realm().objects(MatchedUser)
RLMArray
sは、多対多の関係を表すことを目的としています。 RLMResults
は、データベースクエリの結果を表すことを目的としています。ただし、単純な古いSwift配列を取得したい場合(そして、それを使用することとRLMResults
を使用することのパフォーマンスのトレードオフで問題ない場合)、map(MatchedUser.allObjects()) { $0 }
RLMResultsは遅延読み込み配列であるためです。したがって、配列を返したい場合は、Resultsの拡張機能を記述してください。例:
extension Result {
func toArray() -> [T] {
let newArray: [T] = []
// At here you should append the value from self into newArray
...
return newArray
}
}