如何把Realm中一个class的所有对象放到一个数组中
How to get all objects of a class in Realm to an array
目前我正在使用这个:
var matchedUsersFromRealm = MatchedUser.allObjects()
var matchedUsersInRealm = RLMArray(objectClassName: MatchedUser.className())
matchedUsersInRealm.removeAllObjects()
matchedUsersInRealm.addObjects(matchedUsersFromRealm)
但它看起来很麻烦,而不是像它应该(或已经这样做?)那样把它排成一行。也许有更好的方法?
PS,我正在做一个混合项目,不知何故我只能使用 Objective-C 版本并将其桥接到我的 swift 项目。所以 Realm().objects() 不可用,即使它 returns 结果不是数组。
您可以在 1 行中获取 User 的所有对象:
let matchedUsers = Realm().objects(MatchedUser)
因为 RLMResults 是一个延迟加载数组。所以如果你想 return 一个数组,只需要为 Results 写一个扩展。
示例:
extension Result {
func toArray() -> [T] {
let newArray: [T] = []
// At here you should append the value from self into newArray
...
return newArray
}
}
RLMArray
s 旨在表示对多关系。 RLMResults
表示数据库查询的结果。但是,如果您希望获得一个普通的旧 Swift 数组(并且可以接受使用它与 RLMResults
的性能权衡),您可以执行 map(MatchedUser.allObjects()) { [=13=] }
您可以添加这些扩展:
import Foundation
import RealmSwift
extension Results {
func toArray() -> [T] {
return self.map{[=10=]}
}
}
extension RealmSwift.List {
func toArray() -> [T] {
return self.map{[=10=]}
}
}
然后在抓取的时候:
do {
let realm = try Realm()
let objs = realm.objects(MyObjType).toArray()
// ...
} catch _ {
// ...
}
(如果您使用的是 Swift pre-2.0,请删除 do try catch)
请注意,这会立即将所有内容加载到内存中,这在某些情况下可能是不希望的。如果你在后台获取,这是必需的,因为 Realm 目前不支持在那之后使用主线程中的对象(在这种情况下你还必须将数组映射到非 Realm 对象)。
我更喜欢添加一个助手 class 来使用泛型保存和检索任何类型的对象。
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)
}
}
目前我正在使用这个:
var matchedUsersFromRealm = MatchedUser.allObjects()
var matchedUsersInRealm = RLMArray(objectClassName: MatchedUser.className())
matchedUsersInRealm.removeAllObjects()
matchedUsersInRealm.addObjects(matchedUsersFromRealm)
但它看起来很麻烦,而不是像它应该(或已经这样做?)那样把它排成一行。也许有更好的方法?
PS,我正在做一个混合项目,不知何故我只能使用 Objective-C 版本并将其桥接到我的 swift 项目。所以 Realm().objects() 不可用,即使它 returns 结果不是数组。
您可以在 1 行中获取 User 的所有对象:
let matchedUsers = Realm().objects(MatchedUser)
因为 RLMResults 是一个延迟加载数组。所以如果你想 return 一个数组,只需要为 Results 写一个扩展。 示例:
extension Result {
func toArray() -> [T] {
let newArray: [T] = []
// At here you should append the value from self into newArray
...
return newArray
}
}
RLMArray
s 旨在表示对多关系。 RLMResults
表示数据库查询的结果。但是,如果您希望获得一个普通的旧 Swift 数组(并且可以接受使用它与 RLMResults
的性能权衡),您可以执行 map(MatchedUser.allObjects()) { [=13=] }
您可以添加这些扩展:
import Foundation
import RealmSwift
extension Results {
func toArray() -> [T] {
return self.map{[=10=]}
}
}
extension RealmSwift.List {
func toArray() -> [T] {
return self.map{[=10=]}
}
}
然后在抓取的时候:
do {
let realm = try Realm()
let objs = realm.objects(MyObjType).toArray()
// ...
} catch _ {
// ...
}
(如果您使用的是 Swift pre-2.0,请删除 do try catch)
请注意,这会立即将所有内容加载到内存中,这在某些情况下可能是不希望的。如果你在后台获取,这是必需的,因为 Realm 目前不支持在那之后使用主线程中的对象(在这种情况下你还必须将数组映射到非 Realm 对象)。
我更喜欢添加一个助手 class 来使用泛型保存和检索任何类型的对象。
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)
}
}