gpt4 book ai didi

java - 插入 Room Persistence Library 后获取 rowId

转载 作者:行者123 更新时间:2023-11-29 23:33:07 26 4
gpt4 key购买 nike

我所要做的就是从 insert 中获取 long 的返回值。我明白了,但它不起作用,我从返回值中取回 0。我正在使用 DAO、存储库和 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;
}

@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 Persistence Library 后获取 rowId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52486419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com