Получить rowId после вставленной библиотеки постоянства помещения - PullRequest
0 голосов
/ 24 сентября 2018

Все, что мне нужно сделать, это получить возвращаемое значение из вставки как long.Я получил это, но это не работает, я возвращаю 0 из возвращенного значения.Я использую DAO, Repository и ViewModel, как указано в Google CodeLabs .Я следил за этим постом Rowid после вставки в комнате .

Класс игрока

@Entity(tableName = "player_table")
public class Player {
@PrimaryKey(autoGenerate = true)
private long id;
@NonNull
@ColumnInfo(name = "username")
private String username;
}

DAO

 @Insert
long insert(Player player);

Хранилище

public long insert(Player player) {
    new insertAsyncTask(mPlayerDao).execute(player);
    rowId = player.getId();
return rowId;
}

ViewModel

public long insert(Player player){
    rowId = mRepository.insert(player);
    return rowId;
}

Активность

String playerString = editTextUsername.getText().toString();
Player player = new Player(playerString);
long rowId = mDreamViewModel.insert(player);

Ответы [ 2 ]

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

Проблема в том, что вы возвращаете player.getId () до того, как AsyncTask завершит свою фоновую работу по вставке;вы должны подождать, пока он не выдаст вам правильный результат вставки, и вот предлагаемое решение с использованием поточно-безопасного CountDownLatch, которое приостанавливает выполнение последующего кода с использованием метода .await() до подсчетаCountDownLatch достигает 0;где он уменьшается на 1 каждый раз, когда вызывается .countDown().

public class Repository {

    private long rowId = -1;
    private CountDownLatch mLatch;

    public long insert(Player player) {
        mLatch = new CountDownLatch(1);
        new insertAsyncTask(mPlayerDao).execute(player);
        try {
            mLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.i("LOG_TAG", String.valueOf(rowId));

        return rowId;
    }

    class insertAsyncTask extends AsyncTask<Player, Void, Void> {

        @Override
        protected Void doInBackground(Player... players) {
            rowId = mDatabase.getContactDAO().addContact(players[0]);
            mLatch.countDown();
            return null;
        }
    }

}
0 голосов
/ 27 января 2019

Метод insert в вашем классе репозитория можно изменить следующим образом:

public long insert(Player player) {
    return new insertAsyncTask(mPlayerDao).execute(player).get();
}

Я нашел this , выполнив поиск GitHub для AsyncTasks с "Void, Long" в качестве последнегодва типа, наряду с некоторыми другими терминами, относящимися к Room.

При отладке собственного приложения я увидел, что выполнение оператора return в методе insert происходило до того, как был выполнен метод doInBackground, что казалосьочевидно после того, как я увидел, что это произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...