- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
长期潜伏者,第一次提问。
我在一个项目中使用 Realm Cocoa(来自 Realm.io),并且很难通过 PK 执行搜索。假设我有一个名为 RLMFoo
的实体,它有一个名为 bar
的主键。我还有一个 PK 列表,假设存储在一个数组中:
NSArray *primaryKeys = @[@"bar1", @"bar2", @"bar3"]
有没有办法在一个查询中从我的 Realm 中检索类 RLMFoo
的所有实体?
到目前为止我已经尝试过:
[RLMFoo objectsInRealm:realm withPredicate:[NSPredicate predicateWithFormat:@"bar IN %@", primaryKeys]];
[RLMFoo objectsInRealm:realm where:@"bar IN %@", strippedIds];
.
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id
evaluatedObject, NSDictionary *bindings) {
RLMFoo *foo = (RLMFoo *)evaluatedObject;
return [primaryKeys containsObject:foo.bar];
}];
[RLMFoo objectsInRealm:realm withPredicate:predicate];
但到目前为止,我发现唯一可行的是为每个主键值查询域并聚合结果,这看起来很慢:
NSMutableArray *results = [NSMutableArray new];
for (NSString *primaryKey in primaryKeys) {
RLMFoo *obj = [RLMFoo objectInRealm:realm forPrimaryKey:primaryKey];
if (obj) {
[results addObject:obj];
}
}
有人知道更好的方法吗?
=========解释为什么前三种方法不起作用=======
1) 从异常消息中可以看出这不起作用的原因:IN 仅采用 2 个值,尽管 IN 的 SQL 版本应采用尽可能多的值。我们从RLMQueryUtil.mm
的源码中可以看出,同样适用于BETWEEN运算符:
if (compp.predicateOperatorType == NSBetweenPredicateOperatorType || compp.predicateOperatorType == NSInPredicateOperatorType) {
// Inserting an array via %@ gives NSConstantValueExpressionType, but
// including it directly gives NSAggregateExpressionType
if (exp1Type != NSKeyPathExpressionType || (exp2Type != NSAggregateExpressionType && exp2Type != NSConstantValueExpressionType)) {
@throw RLMPredicateException(@"Invalid predicate",
@"Predicate with %s operator must compare a KeyPath with an aggregate with two values",
compp.predicateOperatorType == NSBetweenPredicateOperatorType ? "BETWEEN" : "IN");
}
这是堆栈跟踪:
*** Terminating app due to uncaught exception 'Invalid predicate', reason: 'Predicate with IN operator must compare a KeyPath with an aggregate with two values'
*** First throw call stack:
(
0 CoreFoundation 0x03334946 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x0292aa97 objc_exception_throw + 44
2 <redacted> 0x00190569 _ZN12_GLOBAL__N_127update_query_with_predicateEP11NSPredicateP9RLMSchemaP15RLMObjectSchemaRN7tightdb5QueryE + 2553
3 <redacted> 0x0018f7ea _Z27RLMUpdateQueryWithPredicatePN7tightdb5QueryEP11NSPredicateP9RLMSchemaP15RLMObjectSchema + 378
4 <redacted> 0x0018b23c _Z13RLMGetObjectsP8RLMRealmP8NSStringP11NSPredicate + 748
5 <redacted> 0x0017d721 +[RLMObject objectsInRealm:withPredicate:] + 161
2) 这在原因和堆栈跟踪上非常相似:
*** Terminating app due to uncaught exception 'Invalid predicate', reason: 'Predicate with IN operator must compare a KeyPath with an aggregate with two values'
*** First throw call stack:
(
0 CoreFoundation 0x03328946 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x0291ea97 objc_exception_throw + 44
2 <redacted> 0x00184599 _ZN12_GLOBAL__N_127update_query_with_predicateEP11NSPredicateP9RLMSchemaP15RLMObjectSchemaRN7tightdb5QueryE + 2553
3 <redacted> 0x0018381a _Z27RLMUpdateQueryWithPredicatePN7tightdb5QueryEP11NSPredicateP9RLMSchemaP15RLMObjectSchema + 378
4 <redacted> 0x0017f26c _Z13RLMGetObjectsP8RLMRealmP8NSStringP11NSPredicate + 748
5 <redacted> 0x00171751 +[RLMObject objectsInRealm:withPredicate:] + 161
6 <redacted> 0x00171465 +[RLMObject objectsInRealm:where:args:] + 213
7 <redacted> 0x001712f3 +[RLMObject objectsInRealm:where:] + 419
3) 这个也非常相似。归根结底, Realm 缺乏对 NSPredicate 完整功能集的支持。
*** Terminating app due to uncaught exception 'Invalid predicate', reason: 'Only support compound and comparison predicates'
*** First throw call stack:
(
0 CoreFoundation 0x03308946 __exceptionPreprocess + 182
1 libobjc.A.dylib 0x028fea97 objc_exception_throw + 44
2 <redacted> 0x001638bd _ZN12_GLOBAL__N_127update_query_with_predicateEP11NSPredicateP9RLMSchemaP15RLMObjectSchemaRN7tightdb5QueryE + 4397
3 <redacted> 0x0016240a _Z27RLMUpdateQueryWithPredicatePN7tightdb5QueryEP11NSPredicateP9RLMSchemaP15RLMObjectSchema + 378
4 <redacted> 0x0015de5c _Z13RLMGetObjectsP8RLMRealmP8NSStringP11NSPredicate + 748
5 <redacted> 0x00150341 +[RLMObject objectsInRealm:withPredicate:] + 161
最佳答案
您的前两个选项应该没问题。编写此查询的最简单方法是:
NSArray *primaryKeys = @[@"bar1", @"bar2", @"bar3"]
RLMResults *results = [RLMFoo objectsWhere:@"id IN %@", primaryKeys];
一个叫做 objectsWithPredicate 的方法也可以。在使用前几种方法时,您可以分享更多代码/堆栈跟踪吗?我认为其他地方发生了问题
关于ios - 境界 cocoa : finding multiple objects by PKs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798898/
我是 Realm 数据库的新手,这太棒了,我对关系这件事几乎没有怀疑。与其一一提出疑问,我更愿意通过一个例子来理解它。下面给出了从 Realm javascript 文档复制的示例 schema。 c
想知道是否有人遇到并解决了这个问题: 描述 我有 2 个名为 Person 和 Dog 的类,一个人可以养不止一只狗。 class Dog: Object { dynamic var name =
我有映射类(简化模型) class Album: Object, Mappable { dynamic var id = 0 var images : List? overri
我尝试在我的 Swift 4 应用程序中使用 realmSwift,但出现错误。 public class Test : Object { @objc dynamic var id: Int
我制作离线词典应用程序。现在我将字典文件转换为 Realm 数据库。 转换函数: if let path = Bundle.main.path(forResource: "dictionary", o
在以下对象模型上: // Dog model class Dog: RLMObject { var name = "" var owner = Person() } // Person
我有一个任务要将现有项目转换为 Swift4(来自 Swift 2.3,不要问 O_o)。使用 RealmSwift 设法修复了除此问题之外的几乎所有问题: 旧代码: class func myFun
我正在尝试创建一个 (iOS) 应用程序,它可以从 Realm 查询一组对象,允许用户搜索并逐步更新 UITableView。我最初以为我会更改我的 Realm Results 实例上的过滤器,但是更
长期潜伏者,第一次提问。 我在一个项目中使用 Realm Cocoa(来自 Realm.io),并且很难通过 PK 执行搜索。假设我有一个名为 RLMFoo 的实体,它有一个名为 bar 的主键。我还
把我的头发拉出来。刚刚做了一个 pod 更新并吸取了 Realm Swift 0.99.1 并且我到处都有 let realm = try! Realm() 行我用 EXC_BAD_INSTRUCTI
在我的应用程序中,我注册了一个通知 block ,它本身必须注册另一个通知 block 。 notificationToken = [self.appState.currentProject addN
我是一名优秀的程序员,十分优秀!