1

iOSアプリケーションにコアデータを使用しており、フェッチリクエストで、何らかの属性によってGROUPをフェッチします。GROUP BYを実行する必要があるため、結果のタイプはNSDictionaryであり、管理対象オブジェクトではありません。

テーブルビューは正常に機能しています。私が直面している唯一の問題は、行を削除することです。行は削除されず、コンテキストはオブジェクトを削除しません。

少し掘り下げてみたところ、結果タイプが管理対象オブジェクトの場合、コンテキストでオブジェクトが削除され、テーブルビューの行が削除されますが、結果タイプがNSDictionaryオブジェクトの場合にのみ機能するため、GROUPBY機能が失われることがわかりました。 。

どんな助けでもいただければ幸いです。

それがFETCHREQUESTメソッドです(編集済み)

NSError * anyError = nil;

AppDelegate * applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext * context = [applicationDelegate managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Merchant" inManagedObjectContext:context];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"premiumActName" ascending:YES];

NSArray *descriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

[request setSortDescriptors:descriptors];

NSPropertyDescription *accountDesc = [[entity propertiesByName] objectForKey:@"premiumActName"];

NSExpressionDescription* objectIdDesc = [NSExpressionDescription new];
objectIdDesc.name = @"objectID";
objectIdDesc.expression = [NSExpression expressionForEvaluatedObject];
objectIdDesc.expressionResultType = NSObjectIDAttributeType;

NSArray *propertiesToFetch= @[accountDesc, objectIdDesc];

[request setPropertiesToFetch:propertiesToFetch];
[request setPropertiesToGroupBy:[NSArray arrayWithObjects:accountDesc, nil]];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];

NSArray *distinctResults = [context executeFetchRequest:request error:&anyError];

NSLog(@"function=%s", __PRETTY_FUNCTION__);

NSLog(@" result =%@", distinctResults);

if(!_fetchedResultsController)
{
    _fetchedResultsController = nil;
}

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];

if(![_fetchedResultsController performFetch:&anyError])
{
    NSLog(@" Error =%@", anyError);
}

if (![context save:&anyError])
{
    // Handle the error.
}

これがテーブルビューの削除行の方法です(編集済み)

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    AppDelegate *applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext * context = [applicationDelegate managedObjectContext];

NSDictionary * dictionary = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSManagedObjectID * iod = [dictionary objectForKey:@"objectID"];

NSManagedObject * object = [context objectWithID:iod];

if (editingStyle == UITableViewCellEditingStyleDelete)
{             
    [context deleteObject:object];

    // Commit the change.
    NSError *error = nil;

    if (![context save:&error])
    {
        NSLog(@"Couldn't save: %@", error);
    }
}

    [self.membersTblView reloadData];
} 

これはオブジェクトとテーブルビューの行も削除しません!

4

1 に答える 1