【问题标题】:(Android, Firebase) databasereference.push().setValue() not working even though log says otherwise(Android,Firebase)databasereference.push().setValue() 无法正常工作,即使日志另有说明
【发布时间】:2017-11-03 18:08:00
【问题描述】:

我正在通过构建一个应用程序来测试 Firebase,该应用程序只是将一条消息放入数据库中(测试的授权设置为 true),它只工作了一次,现在没有任何东西被推送到数据库中。但正如您所见,我将日志放在各处以查看问题出在哪里,令人惊讶的是,onChildEventListener() 似乎注意到了变化。

这是我的主要活动的代码:

public class MainActivity extends AppCompatActivity {

    public final static String TAG = "Main Activity";

    public final int[] id = {0};

    Button sendButton;

    EditText messageEditText;

    String message;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        id[0] = 0;

        sendButton = findViewById(R.id.send_message);

        messageEditText = findViewById(R.id.message_text);

        final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("test/geomessage/");

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                message = messageEditText.getText().toString();

                Log.e(TAG, "Test 1");
                GeoMessage currentGeomessage = new GeoMessage(id[0], message);

                Log.e(TAG, "Test 2");

                databaseReference.child("children").push().setValue(currentGeomessage).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.e(TAG, "Success !");
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "FAIL");
                    }
                }).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        Log.e(TAG, "Complete");
                    }
                });

                Log.e(TAG, "Test 3");
            }
        });


        databaseReference.child("children").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Log.e("101", "Child Added !");
                id[0] = (int) dataSnapshot.getChildrenCount();
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                Log.e("101", "Child CHanged !");
                id[0] = (int) dataSnapshot.getChildrenCount();

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }


    private static class GeoMessage {

        int id;
        String content;

        public GeoMessage() {};

        public GeoMessage(int id, String content) {

            this.id = id;
            this.content = content;

        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }

}

这是我点击“发送”按钮时的日志:

11-03 19:02:13.338 7440-7440/com.example.brumor.geofiretest E/Main Activity: Test 1
11-03 19:02:13.338 7440-7440/com.example.brumor.geofiretest E/Main Activity: Test 2
11-03 19:02:13.340 7440-7440/com.example.brumor.geofiretest E/Main Activity: Test 3
11-03 19:02:13.420 7440-7440/com.example.brumor.geofiretest E/101: Child Added !

【问题讨论】:

  • 我注意到没有“成功”、“失败”或“完成”的 log 声明

标签: java android firebase firebase-realtime-database nosql


【解决方案1】:

当设备未连接到 Firebase 服务器时,会发生观察到的行为。在客户端调用setValue()change the DB cache held locally。这会导致更改位置的侦听器触发。但在 Firebase 服务器更新成功或失败之前,setValue() 的完成侦听器不会触发。

检查您的设备是否有网络连接。您可以使用the example here 检测 Firebase 连接状态。

【讨论】:

  • 确实没有连接,我只需要弄清楚为什么......有什么提示吗?还是非常感谢!
  • @Brumor:检查 logcat 输出。您确定您有网络连接(wifi 或手机)吗?
  • 用不同的模拟器试过了,效果很好!再次感谢
【解决方案2】:
  sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            message = messageEditText.getText().toString();

            GeoMessage currentGeomessage = new GeoMessage(id[0], message);
      databaseReference.child("children").push().setValue(currentGeomessage);

        }
    });

无需使用addonSuccessListener 来存储数据。此外,它甚至没有输入方法 addonSuccessListener ,因此它跳过了整个方法,然后为您打印了日志,但没有任何内容进入数据库。通常onSuccessListener用于firebase存储,看任务是否成功。

也根据这个页面:https://firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/tasks/Task

public abstract Task<T> addOnSuccessListener (OnSuccessListener<? super T> listener)

上述方法已弃用。

你现在必须使用它:

public abstract Task<T> addOnSuccessListener (Executor executor, OnSuccessListener<? super T> listener)

【讨论】:

  • 我添加了一个 OnSuccessListener 专门用于查看任务是否成功,它没有显示任何内容!
猜你喜欢
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2013-12-04
相关资源
最近更新 更多