预加载具有多对多关系的核心数据的最佳实践

恩凯

我正在开发一个具有核心数据的IOS应用程序,我必须预加载与核心数据多对多关系的数据。我有三个表,其中包含超级市场,产品和称为超级市场Toproduct的中间表,用于存储超级市场与产品之间的关系。正如我所说,超市和产品实体之间存在许多关系,因此我需要创建一个中间表来指示这些关系。我的问题是,以多对多关系将JSON格式的数据预加载到我的核心数据中的最佳实践是什么。在Apples参考文档中,声明了无需创建中间表,因为coredata为我们创建了一个中间表。但是,如何在不带中间表的情况下预加载日期时定义多对多关系?顺便一提,所有数据都是静态的,因此无需在表中插入新数据,我只需要获取数据及其相关的超级市场或产品。请注意,联接表具有两个独立的属性,分别称为priceofProductforGivenMarket和primaryProductforGivenMarket。这是我的数据的JSON表示形式,也是我将在核心数据中创建的模型:

Supermarket:
name
location
phone number

Product:
name
price
company

supermarketToproduct:
 nameofsupermarket
 nameofproduct 
 priceofProductforGivenMarket
 primaryProductforGivenMarket
pbasdf

我将创建三个实体,Supermarket,Product和SupermaketProductDetails,其属性和关系如下:

Supermarket:
Attributes: name, location, phone number
Relationship (to many): productDetails

Product:
Attributes: name, price, company
Relationship (to many): supermarketDetails

SupermarketProductDetails:
Attributes:  priceofProductforGivenMarket, primaryProductforGivenMarket
Relationships: (to one) supermarket, (to one) product

在Xcode中,指示Supermarket实体中productDetails关系的“目标”是SupermarketProductDetails实体(具有反向超级市场),同样将SupermarketProductDetails实体设置为Product实体中具有反向产品的超级市场细节的目的地。

然后,我将首先为超级市场解析您的JSON数据,创建超级市场对象并设置名称,位置和电话号码,但无需为产品关系输入任何内容。同样,解析产品JSON并创建所有Products对象。然后,我将解析联接表,并创建SupermarketProductDetails对象。根据您的JSON数据设置属性,并执行获取操作以获取具有正确名称的Supermarket实体,同样获取具有正确名称的Product实体,然后直接设置这些关系。

编辑:假设您将联接表中的每一行解析为四个NSStrings:超级市场名称,产品名称,priceofGivenMarket和primaryProductforGivenMarket。然后每行...

// First fetch the correct Supermarket...
NSFetchRequest *supermarketFetch = [NSFetchRequest fetchRequestWithEntityName:@"Supermarket"]
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",nameofsupermarket];
supermarketFetch.predicate = predicate;
NSError *error;
NSArray *results = [context executeFetchRequest:supermarketFetch error:&error];
// should really check for errors, and that we get one and only one supermarket
NSLog(@"Supermarket fetch returned %i results",[results count]);  // should be only 1!
mySupermarket = (NSManagedObject *)[results firstObject];
if (![[mySupermarket valueForKey:@"name"] isEqualToString:nameofsupermarket]) {
    NSLog(@"Wrong supermarket fetched");
    }

// Now fetch the product...
NSFetchRequest *productFetch = [NSFetchRequest fetchRequestWithEntityName:@"Product"]
predicate = [NSPredicate predicateWithFormat:@"name like %@",nameofproduct];
productFetch.predicate = predicate;
results = [context executeFetchRequest:productFetch error:&error];
// should really check for errors, and that we get one and only one product
NSLog(@"Product fetch returned %i results",[results count]);  // should be only 1!
myProduct = (NSManagedObject *)[results firstObject];
if (![[myProduct valueForKey:@"name"] isEqualToString:nameofproduct]) {
    NSLog(@"Wrong product fetched");
    }

// Now create the SupermarketProductDetails entity:
NSManagedObject *mySupermarketProductDetails = [NSEntityDescription insertNewObjectForEntityForName:@"SupermarketProductDetails" inManagedObjectContext:context];
// set attributes...
[mySupermarketProductDetails setValue:primaryProductForGivenMarket forKey:@"primaryProductForGivenMarket"];
[mySupermarketProductDetails setValue:priceOfProductForGivenMarket forKey:@"priceOfProductForGivenMarket"];
// set relationships...
[mySupermarketProductDetails setValue:mySupermarket forKey:@"supermarket"];
[mySupermarketProductDetails setValue:myProduct forKey:@"product"];
[context save:&error];
// should check for errors...

请注意,您只需要设置这些关系的一方-CoreData会为您更新另一方(即,它将mymymarketDetails添加到myProduct的超级市场详细信息集中,等等)。另请注意,(一对一)关系(例如,超级市场)的“值”是目标对象本身(例如,mySupermarket);您不使用名称或其他任何键。Coredata(隐藏在基础sql表中)使用唯一的objectID进行链接。

(执行此操作可能有更有效的方法,而不是对每个SupermarketProductDetails条目进行两次访存,但这是可行的。)

EDIT2:请注意,以上假设您的实体都被实现为NSManagedObjects。如果为每个实体创建了单独的子类,则可以简化上面的一些代码。例如,valueForKey:和setValue:forKey:可以被等效的属性访问器方法替换,该方法使用点表示法,例如:

[mySupermarketProductDetails setValue:primaryProductForGivenMarket forKey:@"primaryProductForGivenMarket"];

会成为:

mySupermarketProductDetails.primaryProductForGivenMarket = primaryProductForGivenMarket;

[mySupermarket valueForKey:@"name"]

可以替换为:

mySupermarket.name

同样,应使用适当的子类而不是NSManagedObject创建对象。例如。

NSManagedObject *mySupermarketProductDetails = [NSEntityDescription insertNewObjectForEntityForName:@"SupermarketProductDetails" inManagedObjectContext:context];

会成为

SupermarketProductDetails *mySupermarketProductDetails = [NSEntityDescription insertNewObjectForEntityForName:@"SupermarketProductDetails" inManagedObjectContext:context];

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有NSPredicate的核心数据多对多关系filterContentForSearchText

来自分类Dev

具有多关系的复杂核心数据谓词

来自分类Dev

如何仅将具有不同属性的对象添加到核心数据多对多关系NSSet

来自分类Dev

核心数据添加对象多对多关系

来自分类Dev

NSPredicate关于核心数据中的多对多关系

来自分类Dev

核心数据与中间表多对多关系(Swift 2)

来自分类Dev

Swift:多对多关系和mutableOrderedSetValueForKey的核心数据问题

来自分类Dev

核心数据多对多关系更新导致故障

来自分类Dev

多对多关系中的核心数据搜索

来自分类Dev

核心数据-多对多关系中对象的顺序

来自分类Dev

核心数据使用多对多关系保存记录?

来自分类Dev

核心数据(iOS)中与自我的多对多关系

来自分类Dev

核心数据:在多对多关系中获取相关对象

来自分类Dev

核心数据-有关多对多关系属性的信息

来自分类Dev

iOS:具有一对多关系的核心数据更新对象

来自分类Dev

有序多对多关系的最佳实践?

来自分类Dev

核心数据与一对多关系

来自分类Dev

核心数据NSFetchedResultsController对多关系

来自分类Dev

核心数据NSFetchedResultsController对多关系

来自分类Dev

核心数据一对多关系

来自分类Dev

RestKit和核心数据:最佳实践

来自分类Dev

在核心数据一对多关系中使同一对象具有多个时间

来自分类Dev

如何在 NSArrayController 中为具有一对多关系的核心数据设置“内容集”?

来自分类Dev

可可核心数据-检查具有相同属性的对象是否已存在的最佳实践

来自分类Dev

删除核心数据中具有递归关系的记录

来自分类Dev

具有多重关系的核心数据子查询

来自分类Dev

具有独特约束和关系的核心数据

来自分类Dev

iOS在向现有核心数据添加更多关系之后如何利用核心数据?

来自分类Dev

如何在核心数据中插入和获取多对多关系实体

Related 相关文章

  1. 1

    带有NSPredicate的核心数据多对多关系filterContentForSearchText

  2. 2

    具有多关系的复杂核心数据谓词

  3. 3

    如何仅将具有不同属性的对象添加到核心数据多对多关系NSSet

  4. 4

    核心数据添加对象多对多关系

  5. 5

    NSPredicate关于核心数据中的多对多关系

  6. 6

    核心数据与中间表多对多关系(Swift 2)

  7. 7

    Swift:多对多关系和mutableOrderedSetValueForKey的核心数据问题

  8. 8

    核心数据多对多关系更新导致故障

  9. 9

    多对多关系中的核心数据搜索

  10. 10

    核心数据-多对多关系中对象的顺序

  11. 11

    核心数据使用多对多关系保存记录?

  12. 12

    核心数据(iOS)中与自我的多对多关系

  13. 13

    核心数据:在多对多关系中获取相关对象

  14. 14

    核心数据-有关多对多关系属性的信息

  15. 15

    iOS:具有一对多关系的核心数据更新对象

  16. 16

    有序多对多关系的最佳实践?

  17. 17

    核心数据与一对多关系

  18. 18

    核心数据NSFetchedResultsController对多关系

  19. 19

    核心数据NSFetchedResultsController对多关系

  20. 20

    核心数据一对多关系

  21. 21

    RestKit和核心数据:最佳实践

  22. 22

    在核心数据一对多关系中使同一对象具有多个时间

  23. 23

    如何在 NSArrayController 中为具有一对多关系的核心数据设置“内容集”?

  24. 24

    可可核心数据-检查具有相同属性的对象是否已存在的最佳实践

  25. 25

    删除核心数据中具有递归关系的记录

  26. 26

    具有多重关系的核心数据子查询

  27. 27

    具有独特约束和关系的核心数据

  28. 28

    iOS在向现有核心数据添加更多关系之后如何利用核心数据?

  29. 29

    如何在核心数据中插入和获取多对多关系实体

热门标签

归档