我想在我的 Core Data 模型中将我的引用数据与我的用户数据分开,以简化我的应用程序的 future 更新(并且因为,我计划将数据库存储在云端,而无需将引用数据存储在云,因为这是我的应用程序的一部分)。因此,我一直在寻找一种使用获取的属性来编写跨商店关系代码的方法。我还没有找到这方面的任何示例实现。
我有一个使用两种配置的核心数据模型:
数据模型配置 1:UserData(与用户相关的实体)
数据模型配置 2:ReferenceData(与应用程序本身相关的实体)
我为这两个配置设置了 2 个不同的 SQLite 持久存储。
UserData 配置(和存储)包含实体“User”
ReferenceData 配置(和存储)包含实体“Type”和“Item”。
我想创建两个单向弱关系,如下所示:
一个“用户”有一个独特的“类型”
一个“用户”有多个“项目”
这是我的问题:
如何设置我的属性?
每个关系是否需要 2 个属性(一个用于存储唯一 ID,另一个用于访问我获取的结果)?
这种弱关系可以排序吗?
有人可以给我一个实现的例子吗?
作为 Marcus 回答的后续:
浏览论坛和文档,我读到我应该使用我的实体实例的 URI 表示而不是 objectID。这背后的原因是什么?
// Get the URI of my object to reference
NSURL * uriObjectB [[myObjectB objectID] URIRepresentation];
接下来,我想知道,如何将我的对象 B URI (NSURL) 作为弱关系存储在我的父对象 A 中?我应该使用什么属性类型?我该如何转换?我听说过存档...?
然后,稍后我应该以相同的方式检索托管对象(通过取消转换/取消存档 URIRepresentation)并从 URI 获取对象
// Get the Object ID from the URI
NSManagedObjectID* idObjectB = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]];
// Get the Managed Object for the idOjectB ...
最后但同样重要的是,我是否应该在我的实体 A 中声明两个属性,一个用于持久化 URI 需求,另一个用于检索直接对象 B?
NSURL * uriObjectB [objectA uriObjectB];
ObjectB * myObjectB = [objectA objectB];
如您所见,我真的很想念一些简单的例子来实现这些弱关系!非常感谢您的帮助。
最佳答案
到目前为止,拆分数据是正确的答案。引用数据不应与云同步,尤其是因为 iCloud 对允许应用程序同步和存储在文档中的内容有软上限。
要创建跨商店的软引用(它们不需要是 SQLite,但对于一般的应用程序性能来说这是个好主意)你需要有某种可以从另一端引用的唯一键;一个很好的老式外键。
从那里您可以在模型中创建一个获取的属性来引用实体。
虽然这种关系不能直接排序,但您可以通过排序索引创建顺序,或者如果它具有逻辑排序,那么您可以在检索数据后对其进行排序(为此我使用了返回排序数组而不是数组的便捷方法设置)。
我可以举个例子,但你确实走在了正确的轨道上。唯一有趣的部分是迁移。当您检测到迁移情况时,您需要独立迁移每个商店,然后再构建您的核心数据堆栈。这听起来很棘手,但实际上并不难完成。
假设您在用户存储中有一个 UserBar 实体,在引用存储中有一个 RefBar 实体。然后,RefBar 将与 UserBar 建立 fetchedProperty“关系”,从而创建 ToOne 关系。
UserBar
----------
refBarID : NSInteger
RefBar
--------
identifier : NSInteger
然后您可以在建模器中的 RefBar 实体上使用谓词创建一个获取的属性:
$FETCHED_PROPERTY.refBarID == 标识符
让谓词“userBarFetched”的名称
现在它会返回一个数组,所以我们想给 RefBar 添加一个方便的方法
@class UserBar;
@interface RefBar : NSManagedObject
- (UserBar*)userBar;
@end
@implementation RefBar
- (UserBar*)userBar
{
NSArray *fetched = [self valueForKey:@"userBarFetched"];
return [fetched lastObject];
}
@end
创建 ToMany 是相同的,只是您的便捷方法将返回一个数组,并且您需要在返回之前对数组进行排序。
作为Heath Borders提到过,如果需要,可以添加到 NSFetchedProperty 中,但必须在代码中进行。就我个人而言,我一直觉得它很浪费并且不使用该功能。如果我可以在建模器中设置排序,它可能会更有用。
我不建议使用 ObjectID 或 URIRepresentation。 ObjectID(以及该 ObjectID 的 URIRepresentation)可以而且将会改变。每当您迁移数据库时,该值都会发生变化。您最好创建一个不变的 GUID。
您只需要关系的 M 端有一个值,它存储外部标识符。在您的对象子类中,您只需要实现检索对象(或多个对象)的访问器。
关于ios - Cross-Store 与 Fetched Properties 的关系较弱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8209932/
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我想合并多个事件记录关系例如,apple_companies=Company.where("namelike?","%apple%")banana_companies=Company.where("namelike?","%banana%")我想结合这两个关系。不是合并,合并是apple_companies.merge(banana_companies)=>Company.where("namelike?andnamelike?","%apple%","%banana%")我要Company.where("名字像?还是名字像?","%apple%","%banana%")之后,我会写代
我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])
我有一组名为Tasks和Posts的资源,它们之间存在has_and_belongs_to_many(HABTM)关系。还有一个连接它们的值的连接表。create_table'posts_tasks',:id=>falsedo|t|t.column:post_id,:integert.column:task_id,:integerend所以我的问题是如何检查特定任务的ID是否存在于从@post.tasks创建的数组中?irb(main):011:0>@post=Post.find(1)=>#@post.tasks=>[#,#]所以我的问题是,@post.tasks中是否存在"@task
根据我目前的理解,如果我必须描述Rails应用程序的各个组件如何协同工作以响应请求,我会说以下内容:1)路由确定哪些请求URL映射到哪些Controller方法。2)Controller方法从模型中获取信息并将该信息(以全局变量的形式)传递给相应的View模板。3)View模板使用存储在全局变量中的数据来构造最终响应。在上面的解释中,几个组件之间的关系是明确的,不可否认的;即:1)路由和Controller方法2)Controller方法和View模板其实上面的关系是一对一的。但是,模型类与其相邻组件类型(即Controller)的关系并不明确。是的,Controller从模型中检索信