java - 插入Room持久库后获取rowId

标签 java android android-room

我所要做的就是从插入中获取长整型返回值。我明白了,但它不起作用,我从返回值中得到 0。我正在使用 DAO、Repository 和 ViewModel,如 Google CodeLabs 中所述。 。我关注了这篇文章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;
}

View 模型

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

Activity

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

最佳答案

问题在于,您在 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;
        }
    }

}

关于java - 插入Room持久库后获取rowId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52486419/

相关文章:

java - 无法在主线程上访问数据库,因为它可能会长时间锁定 UI 错误

java - 如何将自己的.class 添加到已编译的.jar 文件中?

android - 这个 LinearLayout 应该使用 android :layout_height ="wrap_content"?

Android MP3 MediaPlayer 使某些手机崩溃

java - 如何使用房间数据库从 LiveData 列表中检索用户以显示在 Spinner 中

android - 如何使用 Room 访问 CalendarProvider?

java - 如何并行运行 EJB 调度程序

java - C++ 版 Eclipse (Mac OSX) : Do I need JRE or JDK?

java - 有没有办法在类/代码签名更改时自动重新生成 serialVersionuId?

android - YouTubePlayerView 在屏幕旋转时停止