当前位置: 首页 > 知识库问答 >
问题:

在插入文件室持久性库后获取rowId

钮善
2023-03-14

我所要做的就是从insert中获取作为long的返回值。我得到了,但它不起作用,我从返回的值中返回0。我正在使用一个DAO、存储库和ViewModel,如谷歌代码实验室中所述。在房间里插入后,我一直关注这篇文章。

球员级别

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

视图模型

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个答案

戚阳
2023-03-14

存储库类中的insert方法可以更改为:

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

我通过搜索GitHub找到了最后两种类型为“虚空,长”的异步任务,以及其他一些特定于房间的术语。

在调试我自己的应用程序时,我看到insert方法中的return语句的执行发生在doInBackground方法执行之前,这在我看到它发生之后似乎很明显。

欧博简
2023-03-14

问题是你需要返回玩家。AsyncTask完成后台插入工作之前的getId();您必须等待,直到它向您提供正确的插入结果,这里有一个建议的解决方案,使用线程安全倒计时闩锁,它使用暂停后续代码的执行。等待()方法,直到CountDownLatch的计数达到0;每次递减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;
        }
    }

}
 类似资料:
  • 我一直在使用codelabs实现我的房间数据库持久化。现在,在将数据插入房间数据库后,我正在尝试获取最新的rowID。但是,我被困在存储库中,试图从异步任务返回rowID。 LogEntity.java 洛格道。JAVA 日志数据库。JAVA 日志存储库。JAVA 我放了两个星号,因为我不确定在这里要做什么来获取insert RowID,以及我的AsyncTask是否完全正确。 LogViewMo

  • 我正在我的项目中使用room persistent library。我试图在查询中使用'like'子句,但我无法使用。我尝试过编译时(查询)和运行时查询(原始查询)。它既没有给出任何类型的异常,也没有给出任何输出。 我尝试过以下方法,但都不奏效:- > 编译时查询- 罗奎尔- ComileSdkVersion 27 库使用-实现"android.arch.persistence.room:运行时:

  • 在maven包中,我有一个奇怪的行为。我有一个工件“A”,它取决于“B”。 在“A”中,我有一个包含persistence.xml的META-INF文件夹,在“B”中,我也有一个包含persistence.xml的META-INF文件夹。 这是pom关于shade插件和依赖项的文件A 考虑到“B”也是一个阴影工件,如何从“B”中排除持久.xml文件?

  • 问题内容: 我想做这个列不能为null,但是当我在数据库中插入一个寄存器值null时,这允许我插入。我阅读了文档,但我不知道为什么不起作用。 谢谢 更新:我正在使用 Toplink 和java org.eclipse.persistence.eclipselink:2.4.2 。 问题答案: 我认为如果您使用EntityManager的实现生成模式,则会使用可为空的。我不知道是否也必须在持久化实体

  • 我正在使用Hazelcast进行集群数据分发。我阅读了有关使用MapStore和MapLoader接口的数据持久性的文档。我需要实现这些接口,并在hazelcast中编写类名。xml文件。 有没有使用hazelcast实现这些文件持久性接口的示例?有人知道我可以下载和使用的任何源代码或jar文件吗? 谢谢

  • 问题内容: 最近我一直在阅读关于bout node js的文章,并且聊天功能似乎非常好。但是,我见过的唯一聊天示例基本上是将聊天服务器广播到固定的URL(例如会议室)。是否可以部分使用节点js创建更像gchat的聊天客户端?-在当前页面上弹出一个聊天窗口,然后在多个页面中保留。有人看到过这样的例子吗? 如果不是,是否有其他技术用于此目的的建议(我知道其他问题已回答)? 谢谢。 问题答案: 我将为您