使用带有Realm的ClassName请求RLMObjects

时间:2015-02-09 18:05:31

标签: ios swift realm

我正在开发一个需要从JSON文件同步的应用。调用端点服务后,这些文件是plist创建的。

因此每个文件都以ClassName命名,并包含此类型的所有对象。所以我要做的就是打开每个文件并保存/更新/删除我的领域数据库中的所有这些对象。

目前我丑陋的解决方案是迭代领域架构并使用开关来匹配实体类名:

let realm = RLMRealm.defaultRealm()
var schema = realm.schema.objectSchema as [RLMObjectSchema]
for clazz in schema {
    switch(clazz.className){
    case Class1.className():
        var sortedArray = Class1.allObjects().sortedResultsUsingProperty("updatedAt", ascending: false)
        if(sortedArray.count>0){
            date = sortedArray.firstObject().valueForKey("updatedAt") as Int
        }
        break
    case Class2.className():
        var sortedArray = Class2.allObjects().sortedResultsUsingProperty("updatedAt", ascending: false)
        if(sortedArray.count>0){
            date = sortedArray.firstObject().valueForKey("updatedAt") as Int
        }
    break
    }
}

这段代码是为了同步目的获取实体类的最后更新日期,但我需要它用于其他东西,所以这适用于几个类,但我有40个类......

所以我想知道,如果有办法只使用类名请求Realm DB?来自RLMRealm的东西(例如:RLMRealm.defaultRealm().allObjectsWithClassName("Class1"))或创建带有className的RLMObject以访问请求函数。

2 个答案:

答案 0 :(得分:1)

RLMRealm上有一个私有的,不受支持的方法(在RLMRealm_Dynamic.h中声明,您可以使用 - - (RLMResults *)allObjects:(NSString *)className;。但是,我必须警告您,此方法是私有的,目前不受支持。

答案 1 :(得分:0)

您可以使用Realm类中未记录的函数dynamicObjects。

例如:

let realm = try? Realm()
let dogs = realm.objects(Dog.self)

变为:

 let realm = try? Realm()
 let dogs = realm.dynamicObjects("Dog")

他们在源代码中提出了一个警告:

  

此方法仅在特殊情况下有用,例如,   构建与Realm集成的组件时。如果你只是   在Realm上构建应用程序,建议使用类型化方法   objects(type:)

     
    

返回Realm中给定类名的所有对象。

         
        
  • parameter typeName:要返回的对象的类名。
  •     
  • 返回:给定类名的所有对象作为动态对象      通过:nodoc:
  •     
  

让我永远想起这个。不知道为什么他们选择不在文档中公开这种方法。