在 Realm 中查询(使用 Swift)

Posted

技术标签:

【中文标题】在 Realm 中查询(使用 Swift)【英文标题】:Querying in Realm (using Swift) 【发布时间】:2014-10-01 15:20:04 【问题描述】:

我在玩 realm.io。我已经写了几个对象,现在我想查询它们。我的数据类:

class Sample : RLMObject 
    dynamic var sampleKey : String = ""

还有我的查询代码

@IBAction func readLocalRecord(sender: UIButton) 

    let s : NSString = NSString.stringWithString("sampleKey == SampleValue")
    let p : NSPredicate = NSPredicate(format: "sampleKey = %@", argumentArray: NSArray(object: NSString.stringWithString("SampleValue")))

    // the following throws exception, that I cannot catch in Swift:
    //   'Unsupported predicate value type', reason: 'Object type any not supported'
    let r = Sample.objectsWithPredicate(p)

网站和 RLMObject 的标题表明我应该可以说 Sample.objectsWhere("sampleKey = 'SampleValue'") (或类似的),但 objectsWhere 给出了一个编译错误,抱怨函数不存在,并且没有自动完成功能。所以我尝试使用objectsForPredicate,但这表示类型'any'(挖掘标题,我发现这等于ObjC在Realm 术语中的'id'类型)。我在这里做错了什么?我尝试非常明确,确保使用 NSString 而不是 String 和 NSArray 而不是 Array,但仍然有一些东西被解释为 'id' 而不是特定类型。

有什么建议吗?

干杯

-尼克

【问题讨论】:

【参考方案1】:

您的代码在 Xcode 6 beta 5 中运行良好。顺便说一下,您无需在此处显式使用 NSArrayNSString - Swift 将为您连接到 Objective-c 类型。以下对我有用并打印出我希望看到的对象:

import Realm

class Sample : RLMObject 
    dynamic var sampleKey : String = ""


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 

    var window: UIWindow?

    func readLocalRecord() 

        // create some sample records
        RLMRealm.defaultRealm().beginWriteTransaction()
        var s = Sample()
        s.sampleKey = "Testing"
        RLMRealm.defaultRealm().addObject(s)
        var s2 = Sample()
        s2.sampleKey = "SampleValue"
        RLMRealm.defaultRealm().addObject(s2)
        RLMRealm.defaultRealm().commitWriteTransaction()

        let p : NSPredicate = NSPredicate(format: "sampleKey = %@", argumentArray: [ "SampleValue" ])

        let r = Sample.objectsWithPredicate(p)
        println(r)
    

    func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool 

        readLocalRecord()

        return true
    

输出是:

RLMArray <0x7fe8241218c0> (
    [0] Sample 
        sampleKey = SampleValue;
    

请注意,Realm 的 objectsWithPredicate 方法会返回一个 Realm 数组,而不是普通数组。

【讨论】:

【参考方案2】:

NSArray 总是会返回 [AnyObject] 的等价物?即使指定字符串的类型,当你创建它时,其他对象不一定知道类型,如果可以假设多个。

我会尝试创建一个 [String] 类型的数组并传递它,或者使用直接接受参数的 NSPredicate ( predicateWithFormat:arguments: ) 而不是在数组中 - 也许这会起作用?

最后,我不熟悉领域,但我发现了一个模式,如果某些东西在 swift 中不可用,那么它是可用的,但只有另一种方法可以做到这一点。例如RLMObject 上有一个“对象”数组吗?如果是这样,您可以使用 objects.filter( $0.key == value ) 或完整块(允许使用断点等进行调试 - 我个人更喜欢使用 NSPredicates。

【讨论】:

以上是关于在 Realm 中查询(使用 Swift)的主要内容,如果未能解决你的问题,请参考以下文章

Realm Swift - 按 ID 查找

如何在 NSPredicate 中重现 MATCHES 以查询 Realm?

Realm JS:正确查询以使用 AND 条件从列表中获取对象

使用 Realm 查询结果作为 UITableView 节标题

如何使用 Objective C 查询 Realm DB 中的嵌套对象

等效查询 MagicalRecord -> Realm.io