- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试执行提取操作,以使用从不同上下文中收集的对象ID数组从上下文中检索托管对象。但是,获取返回的是一个空数组。
在“核心数据编程指南”的“检索特定对象”部分中
link:
If your application uses multiple contexts and you want to test whether an object has been deleted from a persistent store, you can create a fetch request with a predicate of the form self == %@. The object you pass in as the variable can be either a managed object or a managed object ID..."
If you need to test for the existence of several objects, it is more efficient to use the IN operator than it is to execute multiple fetches for individual objects, for example:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self IN %@", arrayOfManagedObjectIDs];
- (NSArray *)managedObjectsOfEntityName:(NSString *)entityName fromObjectIDs:(NSArray *)objectIDs managedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
request.predicate = [NSPredicate predicateWithFormat:@"self IN %@", objectIDs];
__autoreleasing NSError *error = nil;
NSManagedObjectID *testID = objectIDs[0];
NSManagedObject *obj = [managedObjectContext existingObjectWithID:testID error:&error];
if (!obj)
{
NSLog(@"Unable to perform fetch. Error: %@", error);
}
error = nil;
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];
if (!results)
{
NSLog(@"Unable to perform fetch. Error: %@", error);
}
return results;
}
results
数组为非null且为空,而
obj
已正确填充。
existingObjectWithID:
的显式调用添加为完整性检查,它随预期对象一起返回,没有错误。
(lldb) po entityName
Foo
(lldb) po objectIDs
<__NSArrayI 0x1170d4950>(
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>,
0xd000000008e80082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p570>,
0xd000000008840082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p545>,
0xd000000006040082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p385>,
0xd000000007740082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p477>,
0xd000000008280082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p522>,
0xd000000008e40082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p569>
)
(lldb) po request
<NSFetchRequest: 0x10f338840> (entity: Foo; predicate: (SELF IN {
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>,
0xd000000008e80082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p570>,
0xd000000008840082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p545>,
0xd000000006040082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p385>,
0xd000000007740082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p477>,
0xd000000008280082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p522>,
0xd000000008e40082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p569>});
sortDescriptors: ((null)); type: NSManagedObjectResultType; )
(lldb) po request.predicate
SELF IN {
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>,
0xd000000008e80082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p570>,
0xd000000008840082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p545>,
0xd000000006040082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p385>,
0xd000000007740082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p477>,
0xd000000008280082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p522>,
0xd000000008e40082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p569>}
(lldb) po testID
0xd0000000055c0082 <x-coredata://CEB1EDA5-7F7A-4342-85E5-6C2E261308CC/Foo/p343>
(lldb) p testID.isTemporaryID
(bool) $7 = false
(lldb) p obj
(NSManagedObject *) $9 = 0x000000010f338630
(lldb) po results
<__NSArrayI 0x10f205c70>(
)
(lldb) po testID.entity
nil
nil
上的
entity
testID
很奇怪,但是我不确定这是“不好的”。
objectWithID:
或
existingObjectWithID:error:
甚至
objectRegisteredForID:
来获取这些对象,但是每个对象都有自己的特殊问题:
objectWithID:
可能会返回一个伪造的对象,如果该对象不在上下文中,并且在上下文中它将返回错误。 existingObjectWithID:error:
很棒,因为我们会取回nil
(而不是伪造的对象),但它也会返回错误。 objectRegisteredForID:
将返回nil
。 objectWithID:
或
existingObjectWithID:error:
来获取一堆对象,则可能是
n
跳到持久性存储中以对对象进行故障处理,这意味着性能可能会很糟糕。如果我使用
objectRegisteredForID:
,即使它恰好不在主队列的MOC中,也可能根本无法获得该对象。
@"self IN %@"
谓词有关,因为我可以删除该谓词并获取
entityName
的所有对象而不会出现问题。我也尝试使用
@"objectID IN %@"
作为具有相同(零)结果的谓词。
最佳答案
好吧,准备好沿着Core Data兔子洞旅行了吗?
TL; DR
持久性存储协调器不再位于内存中的NSManagedObjectID
丢失了其NSEntityDescription
(entity
),并且不等于(isEqual:
返回NO
)来自其他持久性存储协调器的NSManagedObjectID
s,即使它们的URIRepresentation
相同。
在兔子洞下
亲爱的...我们走了。
还记得吗,我是在单独的线程上从单独的受管对象上下文(MOC)收集objectID数组吗?好的。但是,我没有提到MOC正在使用其自己的持久性存储协调器(PSC)(当然,指向同一文件)。 PSC和MOC的生存期很短,因为一旦完成工作,它们就会自动发布,但是当它们还存在时,我将NSManagedObjectID
的实例保存到了NSArray
(将其传递给另一个线程)中。
一旦在单独的线程中接收到,NSManagedObjectID
便具有nil
实体。这似乎正在发生(在这里是有根据的猜测...),因为这些objectID所来自的PSC现在不再在内存中,并且NSManagedObjectID
必须保持对PSC必须保留的NSEntityDescription
(entity
)的引用。 nil
entity
似乎引起了问题,因为评论者怀疑...
我不确定内部结构,但似乎没有entity
,NSManagedObjectID
就是,而不是等于另一个具有相同NSManagedObjectID
的URIRepresentation
。让我说明一下:
在下面的代码中:
* objectID
是持久存储中的NSManagedObjectID *
,不再存储在内存中,并且其实体属性为nil
。
* managedObjectContext
是我们当前线程上的MOC(当然)
NSURL *URIRep = objectID.URIRepresentation;
NSManagedObjectID *newObjectID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:URIRep];
(lldb) p [ojectID isEqual:newObjectID]
(bool) $0 = false
URIRepresentation
必须相同,这些对象也不相等。
[NSPredicate predicateWithFormat:@"self IN %@", objectIDs]
无法匹配任何对象并导致获取请求返回零个对象的原因。
testID
是来自持久性存储的
NSManagedObjectID *
,该持久性存储不再位于内存中,并且其实体属性为
nil
,可以从MOC检索对象而不会出现问题:
NSManagedObject *obj = [managedObjectContext existingObjectWithID:testID error:&error];
NSManagedObjectID
时,请使用相同的持久性存储协调器(PSC)(并确保其驻留在内存中)。如果这样做,NSManagedObjectID
永远不会丢失其entity
,一切都会按预期进行。 NSManagedObjectID
,而是使用其URIRepresentation
。即,不传递NSManagedObjectID
对象数组,而是传递代表每个NSURL
的URIRepresentation
的NSManagedObjectID
数组。一旦准备好使用这些objectID执行提取,就可以使用managedObjectIDForURIRepresentation:
消息从当前MOC的PSC中获取NSManagedObjectID
。 managedObjectIDForURIRepresentation:
似乎非常有效,因此将
URIRepresentation
NSURL
转换为
NSManagedObjectID
似乎并没有增加太多开销。
关于ios - 通过objectID获取NSManagedObjects数组将返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24961088/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!