我已经构建了一个通用函数来从领域获取任何类型的数据,这似乎工作正常。
func getData<T: Object>(withFilter: String) -> Results<T>? {
if !checkRealm(){return nil}
return realm!.objects(T.self).filter(withFilter)
}
我无法弄清楚如何使用此功能删除数据。 我的删除功能如下:
func removeData(withFilter: String) {
let dataToDelete: Results<Object>? = getData(withFilter: withFilter)
// *** The above line crashes the app ***
if let dataToDeleteUnwrapped = dataToDelete{
try? realm!.write {
realm!.delete(dataToDeleteUnwrapped)
}
}
}
这会导致错误,如下所示。虽然Results<Object>?
崩溃了应用,但Results<MyCustomObject>?
工作正常,但我的删除数据功能不再是通用的。
Terminating app due to uncaught exception 'RLMException', reason: 'Object type 'RealmSwiftObject' is not managed by the Realm. If using a custom `objectClasses` / `objectTypes` array in your configuration, add `RealmSwiftObject` to the list of `objectClasses` / `objectTypes`.'
我确信有一个很好的简短方法可以解决这个问题,但我无法想象它,所以任何帮助都会受到赞赏。
答案 0 :(得分:2)
Results
无法保存多个类的实例,其所有元素必须来自同一类型,因此Results<Object>
不是集合的有效类型。
您当前的getData
实施是错误的。您不能在函数中的任何位置使用泛型类型T
。应该为泛型函数的输入参数提供通用类型。您需要对继承自getData
的特定removeData
类型调用Realm
和Object
,因为Result
只能包含一种类型且所有类型都有唯一属性,因此您只能对特定类型使用谓词。
这是getData
的正确通用实现,用于查询具有给定谓词的特定类的Realm
。
func getData<T:Object>(ofType: T.Type, withFilter: String) -> Results<T>? {
if !checkRealm(){return nil}
return realm!.objects(T.self).filter(withFilter)
}
你这样称呼它(以下示例已经过测试,并且正在使用Realm
网站的示例项目中的游乐场):
let people = getData(ofType: Person.self, withFilter: "cars.@count > 1 && spouse != nil")
people?.first?.name //prints Jennifer when called after adding the objects to realm, but before deleting them in the example project
了解如何在具有类型约束的Realm
上使用泛型函数,您也应该能够更新删除函数。
答案 1 :(得分:0)
使用此扩展程序将结果转换为真实对象
extension Results {
func toArray<T>(ofType: T.Type) -> [T] {
var array = [T]()
for i in 0 ..< count {
if let result = self[i] as? T {
array.append(result)
}
}
return array
}
}
如何在代码中使用
let orjObjs = realm.objects(UrObj.self).toArray(ofType: UrObj.self) as [UrObj]