Возвращаемое значение из runInTransaction () в базе данных Android Room - PullRequest
0 голосов
/ 21 сентября 2019

Нет достаточного количества документации, чтобы понять, как именно работает метод runInTransaction ().При выполнении нескольких операций на разных DAO, если никакое значение не должно быть возвращено, я мог бы использовать runInTransaction(Runnable body) ИЛИ runInTransaction(Callable<V> body), если должен быть возвращен какой-либо результат.

Запрос, который у меня есть: Есливсе запросы в транзакции выполнены успешно, затем я хочу вернуть объект изображения, который необходимо загрузить на сервер при успешной транзакции. Если произошло какое-либо исключение или транзакция не удалась, мне нужно вернуть логическое значение со значением false, чтобы указать пользователячто произошла какая-то ошибка.

Вот метод:

public boolean userCheckedIn(final User user) {
    try {
        appDatabase.runInTransaction(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                if (user != null) {

                   //Add entry in table A
                     appDatabase.UserDao().add(user);

                   //Update entry in table B 

                   //Delete an entry from table C 

                    Event image = updateUserAction(action);
                    return image;
                }
                return null;
            }
        });

    } catch (Exception e) {
        return false;
    }
    return true;
}

В вышеупомянутом методе я намерен сделать, если все выполнения базы данных являютсяУспех мне нужно вернуть изображение, которое будет загружено на сервер.Если при выполнении транзакции БД возникло какое-либо исключение или произошла ошибка, мне нужно вернуть false, чтобы пользователь знал, что произошла ошибка.Не уверен, правильно ли я понял.Кроме того, я должен поместить runInTransaction в блок try catch?

1 Ответ

2 голосов
/ 22 сентября 2019

Код для runInTransaction(Callable) эквивалентен версии runInTransaction(Runnable):

  • , если транзакция завершается успешно (исключение не выдается), она устанавливает транзакцию как успешную (вызывая setTransactionSuccessful(), без этого считается неудачным и будет отменен).
  • завершает транзакцию в любом случае (в этот момент, если она была установлена ​​как успешная, вся транзакция фиксируется, в противном случае выполняется откат).
  • если исключение выдается внутри Callable или Runnable, исключение не обрабатывается (в случае Callable оно есть, но перебрасывается).Это означает, что вам нужно обрабатывать его в коде, вызывающем либо runInTransaction(Callable), либо runInTransaction(Runnable).

Основное функциональное отличие состоит в том, что runInTransaction(Callable) возвращает значение, возвращаемое Callable. * 1021.*

Итак, ваш код может делать две вещи:

  • либо возвращать изображение в случае успеха, либо null в случае неудачи, и загружать изображение в метод, вызывающий userCheckedIn(User) или,
  • загрузить изображение внутри вашего userCheckedIn(User) метода

Второе решение (мне проще показать данный код, у меня нет кода для метода, вызывающего * 1034)*) будет выглядеть примерно так:

public boolean userCheckedIn(final User user) {
    try {
        Event image = appDatabase.runInTransaction(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                if (user != null) {
                    //Add entry in table A
                    appDatabase.UserDao().add(user);

                    //Update entry in table B 

                    //Delete an entry from table C 

                    Event image = updateUserAction(action);
                    return image;
                }
                return null;
            }
        });
        if (image != null) {
            // Upload the image to the server
        } else {
            // No image available (probably because of the "if (user != null)"
            // inside Callable). I assume you want to return false in this case.
            return false;
        }

    } catch (Exception e) {
        return false;
    }
    return true;
}
...