web-dev-qa-db-ja.com

Realm内のクラスのすべてのオブジェクトを配列に取得する方法

現在私はこれを使用しています:

    var matchedUsersFromRealm = MatchedUser.allObjects()
    var matchedUsersInRealm = RLMArray(objectClassName: MatchedUser.className())
    matchedUsersInRealm.removeAllObjects()
    matchedUsersInRealm.addObjects(matchedUsersFromRealm)

しかし、それを1行にまとめるだけでなく、面倒に見えるだけです(またはそうしましたか?)。たぶんもっと良い方法がありますか?

PS、私はミックスプロジェクトに取り組んでいますが、どういうわけか、Objective-Cバージョンのみを使用して、それを自分のSwiftプロジェクトにブリッジできます。したがって、Realm()。objects()は使用できません。配列ではなく結果を返しますが。

7
JDG

これらの拡張機能を追加できます。

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オブジェクトにマップする必要もあります)。

22
Ixx

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)

    }
}
4
Rikesh Subedi

ユーザーのすべてのオブジェクトを1行で取得できます。

let matchedUsers = Realm().objects(MatchedUser)
1
jimmy0251

RLMArraysは、多対多の関係を表すことを目的としています。 RLMResultsは、データベースクエリの結果を表すことを目的としています。ただし、単純な古いSwift配列を取得したい場合(そして、それを使用することとRLMResultsを使用することのパフォーマンスのトレードオフで問題ない場合)、map(MatchedUser.allObjects()) { $0 }

1
segiddins

RLMResultsは遅延読み込み配列であるためです。したがって、配列を返したい場合は、Resultsの拡張機能を記述してください。例:

extension Result {
  func toArray() -> [T] {
    let newArray: [T] = []
    // At here you should append the value from self into newArray
    ...
    return newArray
  }
}
0
Huy Le