我玩弄了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
答案 0 :(得分:3)
您的代码适用于我使用Xcode 6 beta 5.顺便说一句,您不需要在此处明确使用NSArray
和NSString
- 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。