Estou usando a biblioteca de persistência de sala do Android para meu novo projeto. Eu quero atualizar algum campo da tabela. Eu tentei como no meu Dao
-
// Method 1:
@Dao
public interface TourDao {
@Update
int updateTour(Tour tour);
}
Mas quando tento atualizar usando este método, ele atualiza todos os campos da entidade onde corresponde ao valor da chave primária do objeto de passeio. Eu tenho usado@Query
// Method 2:
@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);
Está funcionando, mas haverá muitas consultas no meu caso porque tenho muitos campos na minha entidade. Eu quero saber como posso atualizar alguns campos (não todos) como Method 1
onde id = 1; (id é a chave primária gerada automaticamente).
// Entity:
@Entity
public class Tour {
@PrimaryKey(autoGenerate = true)
public long id;
private String startAddress;
private String endAddress;
//constructor, getter and setter
}
android
sql-update
android-room
Rasel
fonte
fonte
Respostas:
Use
@Query
, como você fez no Método 2.Então, tenha entidades menores. Ou não atualize os campos individualmente, mas em vez disso tenha interações mais granulares com o banco de dados.
IOW, não há nada no próprio quarto que fará o que você procura.
fonte
@Query
.true =1
,false=0
SELECT * FROM note_table WHERE isNoteArchived == 0
De acordo com o SQLite Update Docs :
Exemplo:
Entidade:
Dao:
fonte
A partir da Room 2.2.0 lançada em outubro de 2019, você pode especificar uma entidade de destino para atualizações. Então, se o parâmetro de atualização for diferente, a Room atualizará apenas as colunas de entidade parciais. Um exemplo para a pergunta OP mostrará isso um pouco mais claramente.
Observe que você deve criar uma nova entidade parcial chamada TourUpdate, junto com sua entidade Tour real na questão. Agora, quando você chamar update com um objeto TourUpdate, ele atualizará endAddress e deixará o valor startAddress igual. Isso funciona perfeitamente para mim para meu caso de uso de um método insertOrUpdate em meu DAO que atualiza o banco de dados com novos valores remotos da API, mas deixa os dados do aplicativo local na tabela sozinho.
fonte
Você pode tentar isso, mas o desempenho pode ser um pouco pior:
fonte
Acho que você não precisa atualizar apenas alguns campos específicos. Basta atualizar os dados inteiros.
É basicamente uma determinada consulta. Não há necessidade de fazer novas consultas.
Memo.class
A única coisa que você precisa saber é 'id'. Por exemplo, se você deseja atualizar apenas 'título', pode reutilizar 'conteúdo' e 'foto' de dados já inseridos. Em código real, use assim
fonte
Se você precisar atualizar as informações do usuário para um ID de usuário específico "x",
o ViewModel inicializará uma instância de dbManager para acessar o banco de dados. O código deve ser semelhante a este:
Em seguida, basta atualizar seu item de usuário desta forma, suponha que seu userId seja 1122 e userName seja "xyz", que deve ser alterado para "zyx".
Obtenha um userItem de id 1122 Objeto de usuário
Este é um código bruto, espero que ajude você.
Boa codificação
fonte