プログラムで数値を更新しようとしているcoredataプロジェクトがあります。CoreDataからオブジェクトを取得し、それを配列に格納しています。
次に、その配列をループして、現在のユーザーのIPがデータベースに存在するかどうかを確認し、その特定の配列にアクセスされた回数を更新しようとしています。
問題は、ループ配列内の現在のオブジェクトだけでなく、すべてのオブジェクトを更新していることです。
まず、次のようなコアデータから情報を取得します。
- (void)fetchRecords {
// Define our table/entity to use
NSEntityDescription *entity = [NSEntityDescription entityForName:@"IPAddr" inManagedObjectContext:managedObjectContext];
// Setup the fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
// Define how we will sort the records
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"ipDate" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[request setSortDescriptors:sortDescriptors];
// Fetch the records and handle an error
NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (!mutableFetchResults) {
// Handle the error.
// This is a serious error and should advise the user to restart the application
}
// Save our fetched data to an array
[self setIpArray: mutableFetchResults];
}
現在、フェッチされた結果に現在のユーザーIPが存在するかどうかを調べ、存在する場合は、アクセスされた回数を更新しようとしています。
// see if the ip is present and update if necessary
-(void)ipPresent {
NSString * theCurrentIP = [self getGlobalIPAddress];
for (IPAddr *allips in ipArray)
{
if ([allips.ipNum isEqualToString:theCurrentIP]) {
NSLog(@"The IP %@ was found.", theCurrentIP);
// update the ip
NSError *error = nil;
NSNumber *ipToUpdate = allips.ipAccess;
NSNumber *addIpAccess = [[NSNumber alloc] initWithInt:1];
NSNumber *updateIpAddress = [NSNumber numberWithFloat:([ipToUpdate floatValue] + [addIpAccess floatValue])];
[self.ipArray setValue:updateIpAddress forKey:@"ipAccess"];
if ([self.managedObjectContext save:&error]) { // write to database
NSLog(@"The IP Was Updated from %@ to %@", ipToUpdate, updateIpAddress);
} else if (![self.managedObjectContext save:&error]) {
NSLog(@"failed with error: %@", error);
}
break;
} else {
NSLog(@"The IP %@ was NOT found.", theCurrentIP);
}
}
}
問題は次の行にあると確信しています。
[self.ipArray setValue:updateIpAddress forKey:@"ipAccess"];
繰り返しますが、現在のループ内のエンティティだけでなく、すべてのエンティティを更新しています。