在Realm中查询(使用Swift)

时间:2014-08-08 07:52:50

标签: ios types swift realm

我玩弄了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'")(或类似),但是对象在哪里出现编译错误,抱怨函数不存在,并且没有自动完成功能。所以我尝试使用objectsForPredicate,但这表示类型' any' (通过标题挖掘,我发现这等于ObjC' id'在Realm术语中输入)。我在这做错了什么?我试着显得非常明确,确保使用NSString代替String和NSArray而不是Array,但仍有一些东西被解释为' id'而不是特定类型。

有什么建议吗?

干杯

-Nik

2 个答案:

答案 0 :(得分:3)

您的代码适用于我使用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数组,而不是普通数组。

答案 1 :(得分:0)

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

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

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