gpt4 book ai didi

iphone - iOS CoreData 更新实体对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:40 24 4
gpt4 key购买 nike

我正在为一个 iPhone 应用程序实现一个汽车管理器,但我无法保存一辆新车。所以我有一个“汽车”实体(和每个加载的数据库),包含多个属性。我有 2 个 bool 值“保存”和“选择”来跟踪用户添加到他的列表中的汽车(如果添加,保存 = 1)以及当前选择的汽车。所以当我创建一辆新车时,我取消选择旧车(selected=0),并想修改新车以设置其属性 saved=1 和 selected=1。

这是我的功能:

- (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];
}

而且我一直都有这个日志:“救车时出错。”在这两个功能上。所以肯定有问题。

此外,获取我想要修改的汽车而不是立即进行更新非常烦人。如果还有其他请告诉我!

谢谢。

最佳答案

在您的头文件中,您应该为您的汽车设置一个可变数组。

NSMutableArray *carArray;

@property (nonatomic, retain) NSMutableArray *carArray;

然后确保在您的实现文件中综合它。然后当你从你的托管对象上下文中获取时,你可以用返回的内容设置你的数组

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Car" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];

// 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 {
[self setCarArray:mutableFetchResults];
}

这样做会保留托管对象上下文中的所有对象,因此当您想要修改汽车时,您可以在那里找到它而不是再次获取。如果您需要对其进行排序,您可以应用一个排序描述符,该描述符使用您的一个属性作为键进行了初始化。例如:

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"selected" ascending:YES];
[carArray sortUsingDescriptors:[NSArray arrayWithObject:sorter]];

这将根据汽车是否被选中对汽车进行排序。

至于为什么会出现错误,这可能是多种原因之一。通常,如果您的某个属性设置为 nil,MOC 将无法保存,所以这可能就是原因。如果您设置类似以下内容,您可以从中获取一些详细信息

if (![self.managedObjectContext save:&error]) {
NSLog(@"failed with error %@", error);
}

这将返回您遇到的实际错误。设置日志以确保您指定了 Car 也是一个好主意。像 NSLog(@"selected car %@", carToSave); 只是为了安全起见

关于iphone - iOS CoreData 更新实体对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6157634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com