我所要做的就是从插入中获取长整型返回值。我明白了,但它不起作用,我从返回值中得到 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/