问题
I am new to Objective-C and Core Data. I am working on a small project as part of my learning. I created Core Data with entities such as Product
, OrderItem
, Sales
and Supplier
.
Attributes:
Product : product-id, supplier-id, productName, category, subcategory,qty, price,minStock,frequency. Order : order-id, orderDate. OrderItem : order-id, product-id,qty,price, total, orderDate.
I have created relationships between Product
and OrderItem
with OrderItem
inverse to Product
.
Relationship Destination Inverse ordersItem OrderItem --
for OrderItem to Product:
Relationship Destination Inverse product Product ordersItem
My main issue is how do I display ordered items from OrderItem by joining product as: Product-id, ProductName, OrderDate, OrderId, Qty, Price, Total ?
To achieve above if it is normal sql i could run like "Select product-id, productName, order-id, orderDate, qty, price, total from OrderItem o, Product p where o.product-id=p.product-id"
The same way to fetch from OrderItem using core data i could try:
-(NSMutableArray *)loadData{
// Fetch the OrderItems from OrderItem model through from persistent data store
NSManagedObjectContext *managedObjectContext = [self context];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"OrderItem"];
//How do i do to get productName from Product
//the relationship is based on "product" from OrderItem to Product
//I need to get productName and add to array list below to display on the screen.
NSMutableArray *orderList =[[NSMutableArray alloc]init];
orderList =[[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
return orderList;
}
I do not have any issue displaying from one entity but my issue is from multiple entities?
Any help or advice would be appreciated?
I am trying to add Product and OrderItems at the same time in the code below but i am having error "orders.orderToProd = [NSSet setWithObject: entDesc.prodToOrder];" is it the right way ?
- (IBAction)cmdAdd:(id)sender { NSManagedObjectContext *context =[self managedObjectContext]; Product *entDesc =[NSEntityDescription insertNewObjectForEntityForName:@"Product" inManagedObjectContext:context]; //set Product details entDesc.productName = self.txtName.text; entDesc.category = self.txtCategory.text; entDesc.qty=[NSNumber numberWithInteger:[self.txtQty.text integerValue]]; //add OrderItems details here OrderItems *orders=[NSEntityDescription insertNewObjectForEntityForName:@"OrderItems" inManagedObjectContext:context]; orders.price=[NSNumber numberWithInteger:[self.txtprice.text integerValue]]; orders.orderQty=[NSNumber numberWithInteger:[self.txtOrderQty.text integerValue]]; orders.total=[NSNumber numberWithInteger:[self.txtTotal.text integerValue]]; //orderToProd is the relationship object from orderItem to Product and prodToOrder is relationship from Product to OrderItem //I am getting error with this line. I think it expects for array or comma based items //Please help orders.orderToProd = [NSSet setWithObject: entDesc.prodToOrder]; NSError *error = nil; // Save the object to persistent store if (![context save:&error]) { NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); } }
回答1:
NSArray *orderItems = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
returns an array of OrderItem
objects, and you can access the "product" and "order"
attributes simply using the relationships, for example:
for (OrderItem *oi in orderItems) {
Product *product = oi.product;
Order *order = oi.order;
// Display product.productName, oi.qty, order.order-id, ...
}
This assumes that you have a relationship product
from OrderItem to Product
and also a relationship order
from OrderItem to Order.
Note that the attributes order-id, product-id
of OrderItem are redundant,
as the corresponding Product and Order is given via the relationships.
(In other words, Core Data uses relationships and not "foreign keys".)
To your added question: Assuming that orderToProd
is a "to-one" relationship from
OrdersItem to Product, you would do the following to establish a relationship
between the newly created objects:
Product *entDesc = ...
// ...
OrderItems *orders = ...;
// ...
orders.orderToProd = entDesc;
来源:https://stackoverflow.com/questions/20014272/fetch-data-from-core-data-multiple-entities