iphone - 在不更改 Core Data 对象的情况下修改 NSFetchRequest 结果数组的正确方法

标签 iphone objective-c ios core-data

我正在从核心数据数据库中检索数据,并尝试迭代数据并在必要时对数据进行更改。当我更改结果数组中的数据时,事实证明我的数据库也在后端发生更改,而没有进行保存。我想知道在不影响后端数据的情况下更改数据的好做法是什么。

这是我更改数据的代码:

 self.singleDayDataPointsForGraph = [[self fuelPurchaseDataForTimePeriodInMonths:self.numberOfMonthsForGraphView] mutableCopy];
    for (int i = 0; i < self.singleDayDataPointsForGraph.count; i++) {
        FuelPurchase *currentFuelPurchase = [self.singleDayDataPointsForGraph objectAtIndex:i];
        if (i <  self.singleDayDataPointsForGraph.count + 1 && self.singleDayDataPointsForGraph.count >= 2) {
            FuelPurchase *purchaseToCompare = [self.singleDayDataPointsForGraph objectAtIndex:i + 1];
            NSDate *firstDate = currentFuelPurchase.dateTimeStamp;
            NSDate *secondDate = purchaseToCompare.dateTimeStamp;
            NSDateFormatter *dateComparisonFormatter = [[NSDateFormatter alloc] init];
            [dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];

            if([[dateComparisonFormatter stringFromDate:firstDate] isEqualToString:[dateComparisonFormatter stringFromDate:secondDate]] ) {
                float firstValue = [purchaseToCompare.fillSavings floatValue];
                float secondValue = [currentFuelPurchase.fillSavings floatValue];
                purchaseToCompare.fillSavings = [NSNumber numberWithFloat:(firstValue + secondValue)];
                [self.singleDayDataPointsForGraph removeObjectAtIndex:i];
            }
        }

fuelPurchaseDataForTimePeriodInMonths: 方法执行获取并返回 NSArray 结果。自己。 singleDayDataPointsForGraph 是一个 NSMutableArray,它将结果数组存储为可变副本。该方法基本上检查数据库中的两个条目,看看它们是否在同一天,如果是,则将燃料购买量相加并删除其中一条记录。我不希望这改变我的后端数据,但事实确实如此。

非常感谢。

最佳答案

它正在做正确的事情。如果你获取一个核心数据对象并修改它,它会立即反射(reflect)你是否保存它。保存部分确保,如果您退出应用程序并返回,数据也会被保存。

因此,对于您的情况,我会避免修改实际的核心数据对象。而是创建一个模仿核心数据对象的结构并修改该结构。

例如,假设我的 coredata 对象是具有名称和年龄属性的 Person。

从 fetch 中获取的对象是这样的 人物1。

您有一个具有相同属性的 PersonSub 类。

现在您可以创建

PersonSub *personSub = [[PersonSub alloc] init]; //You can create a custom init to initilize from Person core data if you like.
personSub.name = person1.name;
personSub.age = person1.age;

现在可以修改如下

personSub.age = personSub.age + 1;

关于iphone - 在不更改 Core Data 对象的情况下修改 NSFetchRequest 结果数组的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9222336/

相关文章:

iphone - 如何在项目build设置中指定 DEBUG 定义?

iphone - 在iPhone中监听TCP端口

iphone - Objective-C : Best way to store error messages

ios - 返回 NSDictionary - 好的程序设计?

ios - Swift 中的 NSLocalizedString 注释参数

iphone - 如何在 [NSData dataWithContentsOfMappedFile :]? 后检查错误

ios - Ionic 2 RC3 iOS 8 自定义字体字母间距问题

iphone - UIPrintInteractionController 返回 UIPrintUnknownImageFormatError

ios - 错误消息 'Expected ; after top level declarator ' 'Unknown type name import' 带有在 Objective-C 中使用 Swift 的桥

iphone - 使用用户 token 、rest/rails 和钥匙串(keychain)帮助进行 iOS 身份验证