Pergunta

Tentei encontrar a resposta da minha pergunta na internet, mas não consegui. Eu tenho uma entidade simples nos dados principais que possuem um atributo de valor (que é inteiro) e um atributo de data. Quero definir dois métodos no meu arquivo .m.

O primeiro método é o método Add. São necessários dois argumentos: um valor inteiro (inserido pelo usuário na interface do usuário) e uma data (data atual por padrão). e, em seguida, insira um registro na entidade com base nos argumentos.

O segundo método é como um método de incremento. Ele usa a data como chave para encontrar um registro e, em seguida, incrementar o valor inteiro desse registro.

Não sei como escrever esses métodos. (Suponha que tenhamos um controlador de matriz para a tabela no arquivo xib)

Foi útil?

Solução

O segundo método que você está procurando não é apropriado para adicionar à própria entidade. Ele precisa estar em algum lugar acima das entidades, provavelmente em seu objeto controlador.

O primeiro método é o seguinte:

- (void)updateDate:(NSDate*)date andValue:(NSInteger)value
{
  [self setValue:date forKey:@"date"];
  [self setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}

Este é um KVC bastante direto (codificação de valor-chave) e eu recomendo que você leia os documentos da Apple sobre o assunto.

Para o seu outro método, que deve estar em um controlador, você precisa executar uma busca para encontrar o registro.

- (id)findRecordForDate:(NSDate*)date inManagedObjectContext:(NSManagedObjectContext*)moc
{
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc]];
  [request setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];

  NSError *error = nil;
  NSArray *objects = [moc executeFetchRequest:request error:&error];
  NSAssert1(error == nil, @"Error fetching object: %@", [error localizedDescription]);

  return [objects lastObject];
}

- (void)incrementEntityWithDate:(NSDate*)date
{
  id entity = [self findRecordForDate:date inManagedObjectContext:[self managedObjectContext]];
  NSInteger value = [[entity valueForKey:@"value"] integerValue];
  value += 1;
  [entity setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}

Isso também é um acesso de dados principal muito direto. Eu recomendo que você leia como os dados principais funcionam.

Como um aparte, usar uma data como único é um design muito ruim.

ATUALIZAR

Marcus, obrigado pela resposta. É realmente útil. Sou novo nos dados principais, por isso tenho algumas perguntas para tornar as coisas mais claras.

O código para o primeiro método define dois valores, mas não insere o novo registro na tabela. Como posso inserir o registro recém -criado na tabela?

Você precisa ler sobre como os dados principais funcionam. A Apple tem uma ótima documentação sobre como os dados principais funcionam e, se isso falhar, você pode comprar meu livro. Há uma tonelada de informações sobre como usar dados principais na Internet.

Onde devo colocar o primeiro método? No meu arquivo .m?

Este é o objetivo básico-C. Se você estiver fazendo essa pergunta, precisa voltar e aprender os fundamentos do idioma primeiro.

Você mencionou que eu preciso adicionar o segundo método no controlador. Mas o controlador é definido no arquivo XIB. Como posso adicionar o segundo método a isso?

O controlador nunca é definido no arquivo XIB. É referenciado no arquivo xib. Novamente, você precisa voltar ao início de como o Objective-C funciona e aprender o básico antes de mergulhar tão profundo.

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