6

我在玩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' 而不是特定类型。

有什么建议么?

干杯

-尼克

4

2 回答 2

4

您的代码在 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 数组,而不是普通的数组。

于 2014-08-08T10:19:34.217 回答
0

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

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

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

于 2014-08-08T10:16:07.477 回答