Правильный способ изменить массив результатов из NSFectchRequest без изменения объектов Core Data - PullRequest
0 голосов
/ 10 февраля 2012

Я извлекаю выборку из своей основной базы данных и пытаюсь перебрать данные и внести изменения в данные, если это необходимо.Когда я изменяю данные в массиве результатов, оказывается, что моя база данных также изменяется во внутреннем интерфейсе без сохранения.Мне интересно, что было бы полезно использовать для изменения данных, не затрагивая внутренние данные.

Вот код, с которым я меняю данные:

 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, в котором массив результатов хранится как изменяемая копия.Этот метод в основном проверяет две записи в базе данных, чтобы увидеть, если они находятся в один и тот же день, и если они есть, то он добавляет суммы покупки топлива друг к другу и удаляет одну из записей.Я не хочу, чтобы это изменило мои внутренние данные, но это так.

Большое спасибо.

1 Ответ

1 голос
/ 10 февраля 2012

Делает правильно.Если вы возьмете основной объект данных и измените его, он сразу отразит, сохраните ли вы его или нет.Сохраняющая часть гарантирует, что если вы выйдете из приложения и вернетесь, данные также будут сохранены.

Так что для вашей ситуации я бы не стал изменять реальный объект базовых данных.Скорее создайте структуру, которая имитирует основной объект данных, и измените эту структуру.

Пример, скажем, мой объект coredata - это Person с атрибутами name и age.

Объект, получаемый из выборки, - скажемperson1.

У вас есть класс 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;
...