我一直试图运行事务方法,但它无法在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)
我认为,因为您使用的是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上测试时,一切都很好,当我在三星上测试时,数据库中的记录没有创建。这是我负责创建用户的代码: