插入Room Persistence Library后获取rowId

问题描述 投票:0回答:2

我所要做的就是从插入中获取返回值。我得到了但是它不起作用,我从返回的值返回0。我正在使用Google CodeLabs中所述的DAO,Repository和ViewModel。我跟着这篇文章Rowid after Insert in Room

球员类

@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;
}

视图模型

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);
java android android-room
2个回答
0
投票

您的Repository类中的insert方法可以更改为:

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

我发现this通过搜索GitHub的AsyncTasks,其中“Void,Long”作为最后两种类型,以及其他一些特定于房间的术语。

在调试我自己的应用程序时,我看到insert方法中的return语句的执行是在执行doInBackground方法之前发生的,这在我看到它发生之后就显而易见了。


0
投票

问题是你在AsyncTask完成插入后台工作之前返回了player.getId();你必须等到它为你提供正确的插入结果,这是一个建议的解决方案,使用线程安全的CountDownLatch,它使用.await()方法暂停执行后续代码,直到CountDownLatch的计数达到0;每次调用.countDown()时它减1。

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;
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.