NSFetchRequest 使用 IN 语句忽略我的订单
Posted
技术标签:
【中文标题】NSFetchRequest 使用 IN 语句忽略我的订单【英文标题】:NSFetchRequest using IN statement ignores my order 【发布时间】:2014-12-17 16:57:04 【问题描述】:我们有一个网络资源,我想在其中进行搜索,我希望首先返回最低价格的结果。
网络响应正在正确返回内容;并且按照我想要的顺序 - 但是当我使用 IN 语句(我使用 NSSet)执行 NSFetchRequest 时,返回的顺序与我提供的顺序不同,我不确定如何解决它。
为简单起见,我将使用 ID;
以下是来自服务器使用 ID 的响应
(
54916a82e677b8234499df30,
54916a23e677b8234499df2f,
54916938e677b8234499df2d,
5491696ae677b8234499df2e
)
上述集合中的顺序是正确的。
现在当我们这样做时:
NSFetchRequest *fr = [[NSFetchRequest alloc] initWithEntityName:[self entityName]];
fr.predicate = [NSPredicate predicateWithFormat:@"remoteID IN %@", orderedSet];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:fr error:&error];
我做了一个断点——结果数组不再是我输入的顺序。
po results
<_PFArray 0x7fd082a3f960>(
<EmptyLeg: 0x7fd080487af0> (entity: EmptyLeg; id: 0xd000000000800004 <x-coredata://953BCD04-9E4E-497C-8B31-32A58CCB0305/EmptyLeg/p32> ; data:
remoteID = 54916938e677b8234499df2d;
),
<EmptyLeg: 0x7fd0804db7f0> (entity: EmptyLeg; id: 0xd0000000007c0004 <x-coredata://953BCD04-9E4E-497C-8B31-32A58CCB0305/EmptyLeg/p31> ; data:
remoteID = 5491696ae677b8234499df2e;
),
<EmptyLeg: 0x7fd0829937b0> (entity: EmptyLeg; id: 0xd000000000880004 <x-coredata://953BCD04-9E4E-497C-8B31-32A58CCB0305/EmptyLeg/p34> ; data:
remoteID = 54916a23e677b8234499df2f;
),
<EmptyLeg: 0x7fd08291daa0> (entity: EmptyLeg; id: 0xd000000000840004 <x-coredata://953BCD04-9E4E-497C-8B31-32A58CCB0305/EmptyLeg/p33> ; data:
remoteID = 54916a82e677b8234499df30;
)
)
我们可以看到,54916a82e677b8234499df30
应该在列表的顶部,而它却在列表的底部
我希望 NSFetchRequest 尊重输入的顺序,从而以相同的顺序响应输出。
我不需要做进一步的排序,因为服务器已经按照上面的指示返回了订单。
我相信这与此有关:
fr.predicate = [NSPredicate predicateWithFormat:@"remoteID IN %@", orderedSet];
orderedSet
是上面列出的项目的 NSSet。
我如何确保使用 IN 语句的 NSFetchRequest 尊重我的排序而不进一步排序。
我不想依赖通过 remoteID 排序,因为它们不是严格的数字,将来可能无法与字符串进行比较。
非常感谢
获取请求如下;
<NSFetchRequest: 0x7f9f2857dbb0> (entity: EmptyLeg; predicate: (remoteID IN "54916a82e677b8234499df30", "54916a23e677b8234499df2f", "54916938e677b8234499df2d", "5491696ae677b8234499df2e"); sortDescriptors: ((null)); type: NSManagedObjectResultType; )
【问题讨论】:
【参考方案1】:对于 SQL 数据库,除非您使用 ORDER BY 子句,否则不保证返回行的顺序是非常标准的。核心数据类似。如果您想保证顺序,您需要在获取请求上使用排序描述符。或者,可能只是事后对它们进行排序。
【讨论】:
真可惜。我得试试这个。 我刚刚意识到搜索实际上并没有插入数据;所以这可以解释为什么我期望它在无法保证的情况下会保持相同的顺序。所以我会尝试排序。以上是关于NSFetchRequest 使用 IN 语句忽略我的订单的主要内容,如果未能解决你的问题,请参考以下文章
mysql 或oracle的sql中not in 使用的注意
ORA-06550:第 1 行,第 13 列:PLS-00382:表达式类型错误 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略