我正在實施iPhone應用程序的汽車管理器,並且無法保存新車。所以我有一個「Car」實體(和每個加載的DB),包含多個屬性。我有2個布爾值「保存」和「選擇」來跟蹤用戶添加到他的列表(如果添加,保存= 1)以及當前選擇哪輛車的車輛。因此,當我創建一輛新車時,我取消選擇舊車(選擇= 0),並且想要修改新車以設置其屬性saved = 1和selected = 1。iOS CoreData更新實體對象
這裏是我的功能:
- (IBAction)save
{
// Disable the previous car selection.
[self deselectCurrentSelectedCar];
// Add new car as saved and selected.
[self saveAndSelectNewCar];
// Call the delegate to dismiss the modal view.
[_delegate dismissAndSave];
}
- (void)deselectCurrentSelectedCar
{
// Fetched saved car.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
// Set predicate and sort orderings...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = 1"];
[fetchRequest setPredicate:predicate];
// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
NSLog(@"[AddCarViewController] deselect car: car not found.");
}
else {
// Get car and assign new selected value.
Car *carToSave = (Car *)[mutableFetchResults objectAtIndex:0];
[carToSave setSelected:[NSNumber numberWithInt:0]];
// Save the car.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
// Handle the error.
NSLog(@"[AddCarViewController] deselect car: error saving car.");
}
else {
NSLog(@"[AddCarViewController] deselect car: car saved.");
}
}
// Memory management.
[fetchRequest release];
[mutableFetchResults release];
}
- (void)saveAndSelectNewCar
{
// Get the car, and pass to the delegate the new settings.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];
// Set predicate and sort orderings...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(year=%@) AND (make=%@) AND (model=%@) AND (d=%@) AND (n=%@)", _car.year, _car.make, _car.model, _car.d, _car.n];
[fetchRequest setPredicate:predicate];
// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle error.
NSLog(@"[AddCarViewController] save and select: can't save the new car");
}
else {
// Get the car selected.
Car *selectedCar = (Car *)[mutableFetchResults objectAtIndex:0];
[selectedCar setValue:[NSNumber numberWithInt:1] forKey:@"selected"];
[selectedCar setValue:[NSNumber numberWithInt:1] forKey:@"saved"];
// Save the car.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
// Handle the error.
NSLog(@"[AddCarViewController] save and select: error saving car.");
}
else {
NSLog(@"[AddCarViewController] save and select: car saved.");
}
// Add car to delegate.
[EcoAppAppDelegate setUserCar:selectedCar];
}
// Memory management.
[fetchRequest release];
[mutableFetchResults release];
}
而且我有這個記錄所有的時間:「保存錯誤車」在兩個功能上。所以肯定有一些錯誤。
此外,它是相當惱人的取車我想修改它,而不是立即做一個更新。如果有另一個請告訴我!
謝謝。
什麼是錯誤?也許這會有所幫助? – 2011-05-27 21:05:52
SQL執行期間出錯:約束失敗 – Dachmt 2011-05-27 21:09:40
您需要提供更多信息。你有兩個NSLog語句可以打印「錯誤節能汽車」。你從哪一個錯誤中得到了錯誤?當發生這種情況時,NSError參數對此有何評論? Core Data可以告訴你哪裏出了問題,所以這是你應該關注的第一件事。 – 2011-05-27 21:12:00