Можно ли в комнате игнорировать поле при базовом обновлении - PullRequest
1 голос
/ 23 апреля 2019

У меня есть следующий объект:

@Entity
class Foo(
    @PrimaryKey
    @ColumnInfo(name = "id")
    val id: Long,

    @ColumnInfo(name = "thing1")
    val thing1: String,

    @ColumnInfo(name = "thing2")
    val thing2: String,

    @ColumnInfo(name = "thing3")
    val thing3: String,

    @ColumnInfo(name = "thing4")
    val thing4: String
) {

    @ColumnInfo(name = "local")
    var local: String? = null

}

Где локальный - это информация, которая не хранится на сервере, а только локально для телефона.

В настоящее время, когда я получаю информацию с сервераGSON автоматически заполняет мои значения, но, поскольку «local» не приходит с сервера, он не заполняется этим объектом.

Есть ли способ, что при вызове update у меня может быть Room пропустить обновление для«локальный» столбец без записи пользовательского обновления для вставки во все остальные столбцы, кроме «локального»?Беда в том, что у меня может быть много столбцов и каждый новый столбец, который я добавляю, мне нужно добавить это в пользовательский оператор вставки.

Я также думал о сопоставлении «один к одному» с серверасущность для новой "локальной" сущности, однако теперь мне приходится сталкиваться с болью оператора объединения везде, где я получаю свою сущность, поскольку мне нужна локальная информация.

Я надеялся, что смогу сделать что-то подобное:

@Entity
class Foo(
    @PrimaryKey
    @ColumnInfo(name = "id")
    val id: Long,

    @ColumnInfo(name = "thing1")
    val instructions: String,

    @ColumnInfo(name = "thing2")
    val instructions: String,

    @ColumnInfo(name = "thing3")
    val instructions: String,

    @ColumnInfo(name = "thing4")
    val instructions: String
) {

    @Ignore
    var local: String? = null

}

Использование аннотации @Ignore, чтобы попытаться игнорировать локальную строку в общем обновлении.Затем предоставьте пользовательский оператор обновления, чтобы просто сохранить локальную информацию

@Query("UPDATE foo SET local = :newLocal WHERE foo.id = :id")
fun updateLocal(id: Long, newLocal: String)

Однако ROOM кажется достаточно умным, чтобы проверить, что я использовал @Ignore для локального свойства, и он не скомпилируется с этим оператором обновления.

Есть идеи?

1 Ответ

0 голосов
/ 25 апреля 2019

Простой ответ: НЕТ . В комнате нет условной или частичной вставки.

Вы должны придумать логику вставки. Я полагаю, что лучше всего вызывать базу данных и сервер для получения данных и просто обновить значение ответа сервера local значением ответа базы данных local.

Если вам комфортно с Rx , то вы можете сделать что-то вроде этого

localDb.getFoo("id")
    .zipWith(
        remoteServer.getFoo("id"),
        BiFunction<Foo, Foo, Foo> { localFoo, remoteFoo -> 
            remoteFoo.local = localFoo.local
            remoteFoo
        }
    )

Другой возможный способ - написать пользовательский @Query, в который вставляются все значения, кроме локальных, но это невозможно, если у вас много полей.

...