在 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 中运行良好。顺便说一下,您无需在此处显式使用 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 数组,而不是普通数组。
【讨论】:
【参考方案2】:NSArray 总是会返回 [AnyObject] 的等价物?即使指定字符串的类型,当你创建它时,其他对象不一定知道类型,如果可以假设多个。
我会尝试创建一个 [String] 类型的数组并传递它,或者使用直接接受参数的 NSPredicate ( predicateWithFormat:arguments: ) 而不是在数组中 - 也许这会起作用?
最后,我不熟悉领域,但我发现了一个模式,如果某些东西在 swift 中不可用,那么它是可用的,但只有另一种方法可以做到这一点。例如RLMObject 上有一个“对象”数组吗?如果是这样,您可以使用 objects.filter( $0.key == value ) 或完整块(允许使用断点等进行调试 - 我个人更喜欢使用 NSPredicates。
【讨论】:
以上是关于在 Realm 中查询(使用 Swift)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NSPredicate 中重现 MATCHES 以查询 Realm?
Realm JS:正确查询以使用 AND 条件从列表中获取对象
使用 Realm 查询结果作为 UITableView 节标题