Pergunta

Eu tenho uma entidade de dados principal com vários atributos, que incluem quantidade (float), categorytotal (float) e categoria (string)

O ViewController inicial usa um FethchedResultScontroller para recuperar as entidades e classificá -las com base na categoria e depois na categorytotal. Sem problemas até agora.

NSManagedObjectContext *moc = [self managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(dateStamp >= %@) AND (dateStamp =< %@)", startDate, endDate];
[request setPredicate:predicate];

NSSortDescriptor *sortByCategory = [[NSSortDescriptor alloc] initWithKey:@"category" ascending:sortOrder];
NSSortDescriptor *sortByTotals = [[NSSortDescriptor alloc] initWithKey:@"categoryTotal" ascending:sortOrder];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByTotals, sortByCategory, nil];
[request setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"category" cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

Ao selecionar uma linha (TableView: DidSelectrowatIndexPath), outro controlador de exibição é carregado que permite a edição do campo da quantidade para a entidade selecionada.

Antes de retornar à primeira visualização, a categorytotal é atualizada pelo novo 'valor'. O problema ocorre ao retornar ao primeiro controlador de visualização, o aplicativo bombas com

Erro de aplicação grave. A exceção foi capturada durante o processamento principal de mudança de dados: Atualização inválida: número inválido de linhas na seção 0. O número de linhas contidas em uma seção existente após a atualização (1) deve ser igual ao número de linhas contidas nessa seção antes da atualização (1), mais ou menos o número de linhas inseridas ou excluídas dessa seção (0 inserido, 1 excluído). Com o programa UserInfo (NULL) recebeu o sinal: "EXC_BAD_ACCESS".

Isso parece ser cortesia do NSSortDescriptor *SortByTotals = [[NSSortDescriptor aloc] initwithkey:@"categorytotal" Ascendente: Sortorder]; Se eu remover isso, tudo funcionará como esperado, mas obviamente sem a classificação que quero.

Acho que isso tem a ver com a ordem de classificação que muda devido à alteração da categorytotal (exclusão / inserção), mas não consigo encontrar o Fix isso. Eu verifiquei que os valores estão sendo modificados corretamente na segunda visão, por isso parece que o FetchedResultScontroller está sendo confuso. Se o categoryAmount for alterado para um que não alterar a ordem de classificação, nenhum erro será gerado

Não estou mudando fisicamente (ou seja, excluindo) o número de itens que o FetchedResultScontroller está retornando ... o único outro problema que posso encontrar que parece gerar esse erro

Todas as ideias serão bem-vindas

Obrigado, AJ

Foi útil?

Solução

A ordem de seus objetos gerenciados via Seção NomeKeypath deve corresponder à ordem de seus objetos gerenciados através do seu descritor de classificação principal. Como você está usando a "categoria" como sua seção NameKeypath e ainda usando "categorytotal" como seu principal descritor de classificação, não será universalmente verdade que os NameKeypaths da Seção têm a mesma ordem que o descritor de classificação primário. A razão pela qual a remoção do SortByTotals corrige o problema é que a "categoria" se torna o SectionNameKeypath e o principal descritor de classificação e, portanto, ambos têm a mesma ordem.

Outras dicas

Tente mudar seu tipo em seu NSFetchedResultsController primeiro classificar por categoria e depois por categorytotal. Isto deve resolver o problema. Caso contrário, poste seu NSFetchedResultsController Métodos delegados.

Se categoryTotal é uma propriedade transitória que você não pode classificar por essa propriedade usando uma solicitação de busca. Você precisará classificar os objetos do FetchedObjects manualmente (por código) em uma segunda matriz que você pode usar na tabela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top