Estou recebendo uma mensagem de erro estranha dos dados principais ao tentar salvar, mas o problema de que o erro não é reproduzível (aparece em momentos diferentes ao executar tarefas diferentes)
a mensagem de erro:
Unresolved error Domain=NSCocoaErrorDomain Code=1560 UserInfo=0x14f5480 "Operation could not be completed. (Cocoa error 1560.)", {
NSDetailedErrors = (
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x5406d70 "Operation could not be completed. (Cocoa error 1570.)",
Error Domain=NSCocoaErrorDomain Code=1570 UserInfo=0x14f9be0 "Operation could not be completed. (Cocoa error 1570.)"
);
}
e o método que gera o erro é:
- (IBAction)saveAction:(id)sender {
NSError *error;
if (![[self managedObjectContext] save:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]);
exit(-1); // Fail
}
}
alguma idéia para o motivo desta mensagem? dando que apareça em momentos aleatórios
iphone
objective-c
ios
core-data
Ahmed Kotb
fonte
fonte
Respostas:
Isso significa que uma propriedade obrigatória foi atribuída a zero. No seu modelo * .xcodatam, marque a caixa "opcional" ou, quando estiver salvando no managedObjectContext, verifique se as propriedades estão preenchidas.
Se você estiver recebendo mais erros após alterar seu código para atender aos dois requisitos, tente limpar sua compilação e exclua o aplicativo do seu iPhone Simulator / iPhone. A alteração do seu modelo pode entrar em conflito com a implementação do modelo antigo.
Editar:
Eu quase esqueci aqui todos os códigos de erro que o Core Data cospe: Referência de constantes de dados principais Eu já tive problemas com isso antes e percebi que desmarquei a caixa opcional correta. Tanta dificuldade para descobrir o problema. Boa sorte.
fonte
Eu lutei com isso por um tempo. O verdadeiro problema aqui é que a depuração que você tem não está mostrando qual é o problema. A razão para isso é porque CoreData colocará uma matriz de objetos NSError no objeto NSError de "nível superior" que retornará se houver mais de um problema (é por isso que você vê o erro 1560, que indica vários problemas, e uma matriz de erros 1570s). Parece que o CoreData possui um punhado de chaves usadas para esconder informações no erro retornado se houver um problema que fornecerá informações mais úteis (como a entidade na qual o erro ocorreu, o relacionamento / atributo que estava faltando etc.) ) As chaves usadas para inspecionar o dicionário userInfo podem ser encontradas nos documentos de referência aqui .
Este é o bloco de código que eu uso para obter uma saída razoável do erro retornado durante um salvamento:
Ele produzirá uma saída que informa os campos ausentes, o que facilita a solução do problema.
fonte
Estou jogando isso como uma resposta, mesmo que seja realmente mais um enfeite para o trecho de Charles. A saída direta do NSLog pode ser uma bagunça para ler e interpretar, então eu gosto de inserir algum espaço em branco e chamar o valor de algumas teclas críticas 'userInfo'.
Aqui está uma versão do método que eu tenho usado. ('_sharedManagedObjectContext' é um #define para '[[[UIApplication sharedApplication] delegado] managedObjectContext]'.)
Isso me permite ver o valor de 'NSValidationErrorKey', que, quando encontrei o problema do OP, apontou diretamente para as entidades não-opcionais do Core Data que eu esqueci de definir antes de tentar salvar.
fonte
O problema me comoveu quando salvou o segundo registro no CoreData. Todos os campos não opcionais (relacionamento) também foram preenchidos sem nulo, mas na saída de erro eu observaria que um dos campos no primeiro objeto salvo se tornara nulo. Estranho um pouco? Mas o motivo é bastante trivial - um para um relacionamento que anula o primeiro objeto, quando o defino no segundo.
Então, o esquema é:
Alterar o relacionamento no pai de um para um para muitos para um resolveu esta tarefa.
fonte
Eu tinha uma propriedade transitória do tipo int que não era opcional. Obviamente, quando foi definido como 0, o erro 1570 aparece. Acabei de alterar todas as minhas propriedades transitórias para opcional. A lógica de verificação nula pode ser implementada em código, se necessário.
fonte
Quero dizer que seu modelo falhou na validação, o que pode acontecer por vários motivos: propriedade não utilizada em seu modelo, valor ausente marcado como necessário. Para entender melhor o que exatamente deu errado, coloque um ponto de interrupção em um local onde você esteja pronto para salvar seu objeto e chame uma das
validateFor...
variantes do método, como:po [myObject validateForInsert]
Informações mais detalhadas sobre o problema estão na descrição do erro. A validação bem sucedida significa que você não obterá saída.
fonte
Isso me ajudou. Verifique este também.
Marque a caixa opcional em seus objetos * .xcodatamodel
fonte