首页 \ 问答 \ RestKit对象映射:如何从键值映射到新对象/关系?(RestKit Object Mapping: How to map from key values to new object / relation?)

RestKit对象映射:如何从键值映射到新对象/关系?(RestKit Object Mapping: How to map from key values to new object / relation?)

不确定标题是否描述最佳问题,如果您有更好的描述,请编辑标题。

所以我正在实施一个处理产品订单的应用程序。 在每个订单中,都有“行项目”,即每个产品的订单信息。 我们从REST API调用获得的“行项目”的JSON数据如下所示:

JSON数据:

"line_item":{
   "id":1234, // Product ID
   "name":"Cliff Bar",
   "sold_price":12.00,
   "sold_quantity":25
}

CoreData对象(采用JSON格式):

"line_item"{
   "product":{
     "id":1234,
     "name":"Cliff Bar",
     "description":"Awesome food",
     "inventory_level":12,
     "standard_price":11.00
   },
    "sold_price":12.00,
    "sold_quantity":25
}

正如您所看到的,“id”和“name”更像是所售产品的“标识符”,如果您愿意,则更像“主键”。 (CoreData没有主键的概念,RestKit就是这样)当我从其余API获取JSON信息时,它实际上“折叠”了line_item对象内部的产品对象以解决性能问题。

问题1:我该如何处理?

如果产品不存在,是否使用“id”和“name”以外的键值创建新的产品对象? 然后,如果需要,我将获取完整的产品对象。 这是一个好方法吗?

如果我不创建这些不完整的对象,只需保持CoreData对象定义与JSON对象相同。 我担心CoreData中的对象之间没有很强的关系。

如果你有一个,建议一个更好的解决方案!

问题2:

如果问题1的答案是肯定的,我如何将2个键值(“name”和“id”)映射到一个新创建的对象的字段(“line_item”中“product”的“id”和“name”) ? 我在任何教程中都没有找到任何相关信息。

很想知道如何解决这个问题。 谢谢!


Not sure if the title describes the problem the best, if you have better description please edit the title.

So I am implementing an app that deals with product orders. In each order, there are "line items", namely order information for each product. The JSON data of the "line item" we got from the REST API call looks like this:

JSON data:

"line_item":{
   "id":1234, // Product ID
   "name":"Cliff Bar",
   "sold_price":12.00,
   "sold_quantity":25
}

CoreData Object (in JSON format):

"line_item"{
   "product":{
     "id":1234,
     "name":"Cliff Bar",
     "description":"Awesome food",
     "inventory_level":12,
     "standard_price":11.00
   },
    "sold_price":12.00,
    "sold_quantity":25
}

As you can see, "id" and "name" are more like the "identifier" of the product sold, "primary key" if you will. (CoreData doesn't have the notion of primary key, RestKit kind of does) When I get JSON info from the rest API, it actually "collapsed" the product object inside of the line_item object for performance concerns.

Question 1: How should I deal with this?

Do I create new product object with key values other than "id" and "name" null if the product does not exist? And then I will fetch full product object if it is needed. Is it a good approach?

If I do not create these incomplete object and just keep the CoreData object defined the same as the JSON object. I'm afraid there isn't a strong relation between objects in CoreData.

Suggest a better solution if you have one!

Question 2:

If the answer is yes to question 1, how do I map 2 key values ("name" and "id") to fields of one newly created object ("id" and "name" of "product" inside of "line_item")? I haven't found any information about this in any tutorial.

Love to hear how you would approach this problem. Thanks!


原文:https://stackoverflow.com/questions/19801873
更新时间:2019-09-11 05:39

最满意答案

我真的不明白你的问题。 但是对于你的json,如果我是你,我会像这样创建我的核心数据:

  1. LINE_ITEM:
    • 属性:
      • sold_price
      • sold_quantity
    • 关系:
      • 产品
  2. 产品
    • 属性:
      • ID
      • 名称
      • 描述
      • INVENTORY_LEVEL
      • standard_price
    • 关系:
      • 项目

然后我依赖于此创建RestKit映射。

RKManagedObjectStore *mos = [RKObjectManager sharedManager].managedObjectStore;
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Line_item" inManagedObjectStore:mos];
mapping.identificationAttributes = @[@"id"];
[mapping addAttributeMappingsFromArray:@[@"sold_quantity", @"sold_price"]];

[mapping addRelationshipMappingWithSourceKeyPath:@"product" mapping:[Product manageObjectMappingDefinition]];

哦,我意识到我的代码和结构与你的json不兼容。

以下是您如何识别line_item的问题? 没有它,我无法设置identificationAttributes


I don't really understand your question. But with your json, if I were you, I would create my Core Data like this:

  1. Line_item:
    • attribute:
      • sold_price
      • sold_quantity
    • relationship:
      • product
  2. Product
    • attribute:
      • id
      • name
      • description
      • inventory_level
      • standard_price
    • relationship:
      • items

And then I create RestKit mapping depend on this.

RKManagedObjectStore *mos = [RKObjectManager sharedManager].managedObjectStore;
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Line_item" inManagedObjectStore:mos];
mapping.identificationAttributes = @[@"id"];
[mapping addAttributeMappingsFromArray:@[@"sold_quantity", @"sold_price"]];

[mapping addRelationshipMappingWithSourceKeyPath:@"product" mapping:[Product manageObjectMappingDefinition]];

Oh, I realize my code and struct is not compatible with your json.

Here is the question, how you identify your line_item? Without it, I can't set the identificationAttributes.

2013-11-06

相关问答

更多

audio onError参数(audio onError arguments)

我可能发现了错误消息对象。 错误代码位于sound.error.code或e.currentTarget.error.code属性中,它可以包含以下4位数之一: MEDIA_ERR_ABORTED=1 MEDIA_ERR_NETWORK=2 MEDIA_ERR_DECODE=3 MEDIA_ERR_SRC_NOT_SUPPORTED=4 检查了它@jsfiddle I probably found that error message object. The error code is in

如何解决此错误:传递给Zend_Mail_Message :: __ construct()的参数1必须是类型数组,没有给出(How to resolve this error: Argument 1 passed to Zend_Mail_Message::__construct() must be of the type array, none given)

根据Zend文档, Zend_Mail_Message接受一个参数作为参数。 您没有传递任何参数。 这就是你得到这个错误的原因。 __construct(array $ params) 除了Zend_Mail_Part :: __ construct()的参数之外,这个构造函数还支持: 具有原始消息内容的文件的文件名或文件句柄 带有消息标志的flags数组,忽略键,使用Zend_Mail_Storage中定义的常量Inherited_from \ Zend_Mail_Part :: __ con

将提示弹出窗口定位在javascript中(positioning the prompt popup in javascript)

根据您使用的浏览器, prompt (和alert )弹出窗口的实现方式不同。 这是因为弹出窗口是浏览器功能,它们不是JavaScript对象或类似的东西。 (就像每个浏览器的控制台不同,它取决于实现。) 如果你真的想要一致地定位/设置你的提示,你将不得不建立自己的提示。 最简单的方法是使用像jQueryUI这样的库。 另一方面,您可以自己构建它: <html> <body> <input id="showPromptButton" type="button" value

java防止大量if,并用设计模式替换它(s)(java prevent a lot of if and replace it with design pattern(s))

你至少可以做的是声明处理依赖于ApplicationCategories enum的行为的方法。 通过这种方式,如果您要向枚举中添加新值,则只会将代码相对于枚举更改。 通过这种方式,您的代码遵守Open Closed原则,因此更容易维护。 enum ApplicationCategories { PROJECTS, CALENDAR, // And so on... WORKINGBOOK; public static void handle(Appli

如何通过镀铬弧焊机部署Android应用程序的数据库?(How do I view the database of an android app when deployed through chrome arc welder?)

编辑:是的,据我所知(刚刚测试过),您只能在VM或真实设备上运行时调试/监控(使用DDMS)您的应用程序。 那么什么有效(没有DDMS): 打开JavaScript控制台(chrome:// inspect / #apps) Chrome中的plugin.shell('adbd') 终端中的adb pull /data/data/your.package.name/databases/name.db 旧答案(使用DDMS): 如果仅获取数据快照就足够了,您可以使用DDMS。 您可以直接从控制台运

如何在TYPO3 7.6中启用header_position(How to enable header_position in TYPO3 7.6)

你必须建立一个可以重新启用领域的快速扩展。 您需要创建如下文件夹和文件: your_ext / Configuration / TCA / Overrides / tt_content.php该文件的内容是: use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; ExtensionManagementUtility::addTCAcolumns('tt_content',[ 'header_position' => [

防止列宽调整大小(Prevent column width resizing)

防止调整列的大小 从这里 ,我们可以知道setResizable(boolean)允许您选择用户是否可以调整列的大小。 将max和min width设置为相同的值会阻止用户调整列的大小,但不会阻止用户调整列的大小。 此外,用户在尝试调整列大小时将看到调整大小光标但不会看到默认光标。 防止重新排序列 JavaFX 9 为了防止用户重新排序列,在JavaFX 9之前没有直接的解决方案,它引入了setReorderable(boolean) , isReorderable() , reorderabl

添加'www。'(Add 'www.' to URL with htaccess)

尝试放: ErrorDocument 401 "Unauthorized Access" RewriteEngine off ... Authorisation lines 在包含授权指令的.htaccess文件中。 Try putting: ErrorDocument 401 "Unauthorized Access" RewriteEngine off ... Authorisation lines In the .htaccess file containing your auth

相关文章

更多

最新问答

更多
  • asp.net任意用户信息(asp.net arbitrary user info)
  • 如何使用python计算docx文件中表中行的值(How to count the row's values in tables in docx file by using python)
  • MySQL:用户访问和数据库覆盖(MySQL: User access and DB overwriting)
  • 还有另一种“使用未分配的局部变量”的问题(Yet Another “Use of unassigned local variable 'whatever' ” question)
  • 开源证书颁发机构软件(Open source certificate authority software)
  • Rails中的迭代form_for是在create上添加模型的所有实例(Iteration in Rails form_for is adding all instances of model on create)
  • 如何扩展我的表视图单元格?(How to expand my table view cell?)
  • 如何使用SPARQL区分Thing和无生命对象(How to differentiate between a Thing and an inanimate object with SPARQL)
  • 在IdentityServer中,Client Secrets和Scope Secrets有什么区别?(In IdentityServer, what is the difference between Client Secrets and Scope Secrets?)
  • 如何在具有附加类时重写类(How do I override a class when it has a attached class)
  • 如何使用Git在Azure上部署C#,MVC4应用程序(How to deploy a C#, MVC4 application on Azure using Git)
  • Sitecore 7内容搜索爬网程序根目录之外的索引项(Sitecore 7 Content Search indexing items outside of crawler root)
  • 我应该在线课程使用utf-8编码吗?(Should I use utf-8 encoding for an online course?)
  • 如何在Cucumber-JS步骤定义中使用Node-mysql连接到MySQL?(How to connect to MySQL using Node-mysql in a Cucumber-JS step definition?)
  • 在MVC 4中的google.maps.LatLng(lat,lon)中将JSON字符串值分配给纬度和经度(Assign the JSON string value to Latitude and Longitude in google.maps.LatLng(lat,lon) in MVC 4)
  • awk:通过特定的分隔符删除字符串(awk: remove strings by specific delimiter)
  • 如何测试Vista的应用程序(How to test app for Vista)
  • Elasticsearch聚合器 - 缺失值的工作原理(Elasticsearch aggregators - How missing values work)
  • 绘制datetime.date熊猫(Plot datetime.date pandas)
  • PostgreSQL作为WSO2 EI和APIM + IS的数据源(PostgreSQL as datasource for WSO2 EI and APIM+IS)
  • 如何使用bash在postgres中运行alter table脚本(How to run alter table script in postgres using bash)
  • 可能使用PHP阻止整个美国州访问我的网站?(Might it be possible to block an entire US state from accessing my site, using PHP?)
  • restangular删除并输入错误网:: ERR_NAME_NOT_RESOLVED(restangular remove and put error net::ERR_NAME_NOT_RESOLVED)
  • 常见问题解答的Modx(Revolution)搜索功能(Modx(Revolution) search function for FAQs)
  • Rubymine如何使用远程口译员和Git?(How Does Rubymine Work With Remote Interpreters and Git?)
  • prepareForSegue和PerformSegueWithIdentifier发件人(prepareForSegue and PerformSegueWithIdentifier sender)
  • postgrsql与PowerShell无提示安装问题(postgresql silent installation issue with powershell)
  • 比较两个greps的输出(Comparing output from two greps)
  • 使用.NET RIA Data Services删除Silverlight 3中的数据(Deleting data in Silverlight 3 with .NET RIA Data Services)
  • 此行中AND运算符的含义(meaning of the AND operator in this line)