Я использую библиотеку сохраняемости комнаты Android для своего нового проекта. Я хочу обновить какое-то поле таблицы. Я пробовал как в моем Dao
-
// Method 1:
@Dao
public interface TourDao {
@Update
int updateTour(Tour tour);
}
Но когда я пытаюсь выполнить обновление с помощью этого метода, он обновляет каждое поле объекта, где оно соответствует значению первичного ключа объекта тура. я использовал@Query
// Method 2:
@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);
Он работает, но в моем случае будет много запросов, потому что у меня много полей в моей сущности. Я хочу знать, как обновить некоторые поля (не все), например Method 1
where id = 1; (id - это автоматически сгенерированный первичный ключ).
// Entity:
@Entity
public class Tour {
@PrimaryKey(autoGenerate = true)
public long id;
private String startAddress;
private String endAddress;
//constructor, getter and setter
}
Ответы:
Используйте
@Query
, как в методе 2.Затем создайте более мелкие организации. Или не обновляйте поля по отдельности, а вместо этого более детально взаимодействуйте с базой данных.
IOW, в самой комнате нет ничего, что могло бы делать то, что вы ищете.
источник
@Query
.true =1
,false=0
SELECT * FROM note_table WHERE isNoteArchived == 0
Согласно документации по обновлению SQLite :
Пример:
Сущность:
Dao:
источник
Начиная с Room 2.2.0, выпущенного в октябре 2019 года, вы можете указать целевую сущность для обновлений. Затем, если параметр обновления отличается, Room обновит только столбцы частичного объекта. Пример для вопроса OP покажет это немного более четко.
Обратите внимание, что вам необходимо создать новую частичную сущность TourUpdate вместе с вашей реальной сущностью Tour в вопросе. Теперь, когда вы вызываете update с объектом TourUpdate, он обновит endAddress и оставит значение startAddress прежним. Это идеально подходит для меня в моем случае использования метода insertOrUpdate в моем DAO, который обновляет БД новыми удаленными значениями из API, но оставляет только данные локального приложения в таблице.
источник
Вы можете попробовать это, но производительность может быть немного хуже:
источник
Я думаю, вам не нужно обновлять только какое-то конкретное поле. Просто обновите все данные.
По сути, это заданный запрос. Не нужно делать новый запрос.
Memo.class
Единственное, что вам нужно знать, - это id. Например, если вы хотите обновить только «заголовок», вы можете повторно использовать «контент» и «фото» из уже вставленных данных. В реальном коде используйте вот так
источник
Если вам нужно обновить информацию о пользователе для определенного идентификатора пользователя «x»,
ViewModel будет инициализировать экземпляр DBManager для доступа к базе данных. Код должен выглядеть так:
Затем просто обновите свой пользовательский элемент таким образом, предположим, что ваш userId - 1122, а userName - «xyz», который необходимо изменить на «zyx».
Получить userItem с идентификатором 1122 Пользовательский объект
Это необработанный код, надеюсь, он вам поможет.
Удачного кодирования
источник