这很有趣。 在我的应用程序中,我在数据库中创建了数千个条目(在另一个线程中,我正在使用 MagicalRecord)。一切似乎都很好(从背景/前景/上下文的角度来看)。
当我在主线程中尝试获取“刚插入”的数据时,我发现了以下行为:
- (NSArray *) familiesInCompany:(Company *) company {
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"company == %@", company];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"company.name == %@", company.name];
NSArray *first = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate1];
NSArray *second = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate2];
NSArray *third = [Family MR_findByAttribute:@"company" withValue:company andOrderBy:@"name" ascending:YES];
return second;
}
现在我得到的是:
Family 对象通过调试 SQL 语句,我得到以下信息:
“第一个”声明:
CoreData: annotation: total fetch execution time: 0.0000s for 0 rows.
“第二个”声明:
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZNAME, t0.ZCOMPANY FROM ZFAMILY t0 JOIN ZCOMPANY t1 ON t0.ZCOMPANY = t1.Z_PK WHERE t1.ZNAME = ? ORDER BY t0.ZNAME
CoreData: annotation: sql connection fetch time: 0.0005s
CoreData: annotation: total fetch execution time: 0.0007s for 2 rows.
“第三”声明:
CoreData: annotation: total fetch execution time: 0.0000s for 0 rows.
有趣的是,我关闭了应用程序(我的意思是真正手动终止它),然后重新打开它,所有三个“获取”语句都起作用了。
为什么第一条和第三条 fetch 语句似乎从未执行过?如何深挖问题?
最佳答案
我遇到了同样的问题,这是我发现的,以及我是如何解决的。
Magical Record 有一个根 NSManagedObjectContext 作为默认 NSManagedObjectContext 的父级。当我在默认上下文中创建 NSFetchedResultsController 时,一切似乎都运行良好,就像您一样。
问题是所有新 NSManagedObject 都返回了它们仍然是临时的 ObjectID。因此,在我的例子中,我使用了 NSPredicate 来限定关联表上的查询范围。我不只是调用关联方法,因为我不想将所有内容 加载到内存中,而是希望NSFetchedResultsController 为我处理更改。
使用临时 ObjectID 查询找到零个结果,这正是它显示的结果。
显然,子上下文(默认)无法从转换为非临时 ID 中获益,即使它已持久保存到后备存储中。
当我试图用 obtainPermanentIDsForObjects:error: 强制解决问题时,更糟糕的事情发生了。 Core Data 提示它无法满足我的实例的故障。没关系,这不可能是真正的错误。简单地刷新对象也没有效果。我怀疑这是一个 Core Data 错误,几乎没有人会因为他们只是使用关联方法来获取 NSSet 而发痒。
我的解决方法是使用 NSFetchedResultsController 的父上下文,就像在这个问题中一样,Magical Record, saving, and NSFetchedResultsController .
我已经在编辑时将默认值包装在一个新的子上下文中,因此,使用 createInContext 将实例复制到该编辑上下文中,所以我不需要做任何额外的工作将 .parentContext 添加到参数中。
顺便说一句,这只发生在关联源的新实例上。一旦一个实例从启动时就存在,它就有一个非临时的 ObjectID 并且从来没有出现过问题。
关于ios - NSPredicate 未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11212702/
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption