【问题标题】:How can I extract an INT from the following ROOM Database query result?如何从以下 ROOM 数据库查询结果中提取 INT?
【发布时间】:2021-06-03 19:57:25
【问题描述】:

我正在运行以下有效的 Room SQL 查询,以便为自动递增的 payee 列查找下一个可用 ID,并希望从中捕获结果作为整数。下面的代码就是这样做的,但它只在使用断点单步执行时有效,而在正常执行时无效:

@Query("SELECT seq FROM SQLITE_SEQUENCE WHERE name = 'payee'")
int getNextAutoIncrementPayeeID();

下面的repository方法调用上面的Dao方法:

 public void getNextAutoIncrementPayeeID(OnValueListener listener) {

    executor.execute(new Runnable() {
        @Override
        public void run() {
            // Call the listener callback
            listener.onValue(db.payeeDao().getNextAutoIncrementPayeeID());
        }
    });

}

使用的接口:

public interface OnValueListener {

    public void onValue(int value);

}

现在value 的结果被分配给一个全局变量payeeId 但是,这仅在运行带有断点的代码时有效:

 repository.getNextAutoIncrementPayeeID(new OnValueListener() {
        @Override
        public void onValue(int value) {
            // use "value" which is returned from Room

            payeeId = value;

        }
    });

【问题讨论】:

  • 您是否尝试过仅检索 seq 而不是整数数组 "SELECT seq FROM SQLITE_SEQUENCE WHERE name = 'payee'" 应该返回 intlong

标签: android sql android-room


【解决方案1】:
final int[] result = {0};
int test = result[0];
return test;

这是在主线程中调用的,所以它在db.payeeDao().getNextAutoIncrementPayeeID()运行的后台线程启动之前返回0。

所以,您需要等到查询db.payeeDao().getNextAutoIncrementPayeeID(); 完成并返回结果,但是您可以等待多长时间?

好吧,在这种情况下,您可以使用侦听器并在从 Room 数据库返回值时触发其回调。

创建一个接口,该接口具有接受 int 的回调

interface OnValueListener {
    public void onValue(int value);
}

将接口实例传递给存储库查询

 public void getNextAutoIncrementPayeeID(OnValueListener listener) {

    executor.execute(new Runnable() {
        @Override
        public void run() {
            // Call the listener callback
            listener.onValue(db.payeeDao().getNextAutoIncrementPayeeID());
        }
    });

}

并在调用的活动/片段中实现OnValueListener 实例:

getNextAutoIncrementPayeeID(new OnValueListener() {
    @Override
    public void onValue(int value) {
        // use "value" which is returned from Room
    }
});

【讨论】:

  • 谢谢@Zain ...这可能是我需要的,非常感谢。如何在最终的活动/片段调用期间一直传递 int 并将其作为变量访问?
  • 您需要创建类似的方法,一直到接受OnValueListener 对象作为参数的活动,并最终在活动/片段中像我一样实现这个实例。如果这样解决了问题感谢接受答案
  • 谢谢@Zain,当我使用断点单步执行代码时,它可以工作并提取一个值,但是每当我在没有断点的情况下执行它时,它永远不会提取一个值。我不知道为什么,它是相同的代码......它是否与线程或时间有关?
  • 你能用当前代码更新问题吗
  • 我已经更新了代码@Zain...任何进一步的建议将不胜感激,这让我发疯了。
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2019-04-20
  • 1970-01-01
  • 2013-01-10
  • 2021-07-31
  • 2021-02-04
相关资源
最近更新 更多