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

实时数据库事务

段干麒
2023-03-14

我一直试图运行事务方法,但它无法在firebase数据库中获取和设置正确的数据。

代码如下:

 private void receiveMoney() {
    String mobile=recipientText.getText().toString().trim();
    Double amount=Double.parseDouble(amountText.getText().toString().trim());
    mDatabase3=FirebaseDatabase.getInstance().getReference("account_details/Gn2eRixQQiTpvhX870n6nZp66tO2");
    mDatabase3.runTransaction(new Transaction.Handler() {

        @NonNull
        @Override
        public Transaction.Result doTransaction(@NonNull MutableData currentData) {

            Double newBalance=(double) currentData.child("initialBalance").getValue();
            System.out.println("Current Balance: "+newBalance+"  Amount: "+amount);

            currentData.setValue(newBalance);
            return Transaction.success(currentData);
        }

        @Override
        public void onComplete(@Nullable  DatabaseError error, boolean committed, @Nullable DataSnapshot currentData) {

        }
    });
}
E/RepoOperation: Caught Throwable.
java.lang.NullPointerException: Attempt to invoke virtual method 'double java.lang.Double.doubleValue()' on a null object reference
    at com.example.efikas.SendMoneyActivity$1.doTransaction(SendMoneyActivity.java:86)
    at com.google.firebase.database.core.Repo.startTransaction(Repo.java:933)
    at com.google.firebase.database.DatabaseReference$4.run(DatabaseReference.java:492)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:784)

共有1个答案

巩镜
2023-03-14

我认为,因为您使用的是runtransaction,所以您应该只关注一件事。

mDatabase3=FirebaseDatabase.getInstance().getReference("account_details/Gn2eRixQQiTpvhX870n6nZp66tO2/initialBalance");
mDatabase3.runTransaction(new Transaction.Handler() {

    @NonNull
    @Override
    public Transaction.Result doTransaction(@NonNull MutableData currentData) {
        if (currentData.getValue() == null) {
            currentData.setValue(0);
        } else {
            Double newBalance= (Double) currentData.getValue();
            System.out.println("Current Balance: "+newBalance+"  Amount: "+amount);

            currentData.setValue(newBalance);
        }
        

        return Transaction.success(currentData);
    }

    @Override
    public void onComplete(@Nullable  DatabaseError error, boolean committed, @Nullable DataSnapshot currentData) {

    }
});
 类似资料:
  • 这是我的用户。kt 我做错了什么?

  • 我在一个Android应用程序中使用Firebase数据库,每次用户启动时,我都会在数据库中存储一些值,为此我会执行以下操作: 正如您在子方法中看到的,如果称为“usrId”,它将创建usrId目录,并在其中添加所有neccesary信息。但是我想为每个用户创建目录,所以我尝试传递usrId变量作为参数。但它不起作用。当我调试代码时,调试器说本地var usrId无法识别,我的问题是如何在Fire

  • 一、Attach数据库: ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name。最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的。见如下示例:

  • 我使用Firebase,确切地说是一个实时数据库,我不知道应该设置什么规则。我制定了以下规则: 但现在每个人都可以写作了。当我设置这些: 使用Gmail的用户无法登录,因为数据库中的记录没有创建,但不是在所有设备上。当我在OnePlus上测试时,一切都很好,当我在三星上测试时,数据库中的记录没有创建。这是我负责创建用户的代码: