【发布时间】:2014-05-29 16:58:19
【问题描述】:
我对 Objective-C 比较陌生,并试图通过学习 CoreData 来学习,尽管有大量的 Google 搜索。我对 mySQL 和关系表有很好的了解,但我似乎无法思考如何让实体在 CoreData 中相互关联。
我喜欢在学习 CoreData 之类的东西时为自己创建一些小项目,所以我总结了汽车服务跟踪器的简单概念(如换油、制动工作等)。
我有 2 个实体代表车辆和换油,就像这样......
和
...以及它们各自的关系。我不确定这是否需要一对一或一对多的关系,因为车辆会更换很多机油,但也会有很多车辆......所以我猜这是第一件事我需要一些帮助来理解。
我正在使用 SQLLite Manager 来观察数据模型的情况。当我将车辆添加到我的车辆实体(基本上保存 UITextFields)时,我可以看到对象位于正确的实体中......
...当我将换油添加到特定车辆时,我可以看到这些对象也被放入了它们的正确实体中...
.. 但正如您从以下内容中看到的那样,在尝试将特定换油与特定车辆关联时似乎存在断开...
现在,对于重要的问题......
1)。我如何让单独的机油更换仅与他们各自的车辆相关?现在,无论选择哪种车辆,都会显示所有换油。我确信这与更新我获取的结果查询有关,但是正如您从显示的表格中看到的那样,我没有得到相应车辆的相应换油。
2)。这可以通过理解问题 1 来解决……但是如果我删除了特定的车辆,那么我显然还需要删除与该车辆相关的任何换油。
我的保存方法如下。
- (IBAction)save:(id)sender {
Oil *oil = [NSEntityDescription insertNewObjectForEntityForName:@"Oil" inManagedObjectContext:self.managedObjectContext];
Vehicle *vehicle = [NSEntityDescription insertNewObjectForEntityForName:@"Vehicle" inManagedObjectContext:self.managedObjectContext];
// Which Vehicle
// newOil.vehicle = whichVehicle.text;
oil.vehicle = vehicle; // not working
// Format: Mileage
NSNumberFormatter *numberFormat = [[NSNumberFormatter alloc] init];
[numberFormat setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *myNumber = [numberFormat numberFromString:oilMileage.text];
oil.oilMileage = myNumber;
// Format: Date
NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
[dateFormat setDateFormat:@"MM-dd-yyyy"];
oil.oilDate = [dateFormat dateFromString:oilDate.text];
// Format: Notes
oil.oilNotes = oilNotes.text;
// save context
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate saveContext]; }
->
->
->
->
好的,我正在尝试整合 Dan Shelly 的建议(这完全有道理),但是我遇到了一个需要更多指导的障碍。
我的 mainVC 没有使用 tableView 来显示我的车辆(我已将车辆总数限制为 4,我用图标表示它们并将它们绑定回 CoreData 中的车辆 ID)......无论如何,因为它不是一个 tableView 我不能使用以下内容:
Vehicle *existingVehicle = (Vehicle *)[self.fetchedResultsController objectAtIndexPath:indexPath];
...因此,我无法为获取的 Vehicle 对象创建一个实例,然后我可以将其传递给 OilViewController。我有一个 fetchRequest 从 CoreData 返回正确的车辆 ID,但我需要知道如何实际创建对象,以便可以将其传递给 OilViewController。我的 fetchRequest 看起来像这样...
- (void)fetchObjects {
NSLog(@"DVC-fetching Objects\n\n");
// Create Fetch Request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Vehicle" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
// Set Search Criteria
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"vehicleID == %@", vehicleID];
[fetchRequest setPredicate:predicate];
NSError *error;
NSArray *array = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
NSLog(@"Object ID: %@", [array valueForKey:@"objectID"]);
NSManagedObjectID *moID = [array valueForKey:@"objectID"];
if (array != nil) {
NSUInteger count = [array count]; // May be 0 if the object has been deleted.
Vehicle *existingVehicle = (Vehicle *)[self.managedObjectContext existingObjectWithID:moID error:&error];
NSLog(@"Count: %lu", (unsigned long)count);
NSLog(@"Fetched Vehicle ID: %@",predicate);
NSLog(@"existingVehicle: %@", existingVehicle);
} else {
// Deal with error.
}
}
但我收到以下错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI isTemporaryID]:无法识别的选择器已发送到实例 0x11d5b660”
- moID 正确返回为“0x8bb1980 x-coredata://6681B331-29F0-448B-82F1-4660E033A460/Vehicle/p1”
- 数组计数返回“1”[正确]
- FetchVehicle ID 返回“vehicleID == 1”[也正确]
如何为这个返回的对象创建一个 Vehicle 实例,以便我可以传递它??
【问题讨论】:
-
无法发布图片。
-
我为你添加了它们。
-
感谢 MartinW!我很感激协助......被血腥的声誉警察所阻碍:)
标签: xcode core-data entity-relationship cascade nsfetchrequest