(Android,Firebase)databasereference.push()。setValue()即使日志另有说明也无法正常工作

时间:2017-11-03 18:08:00

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

我正在测试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 !

2 个答案:

答案 0 :(得分:0)

  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)

答案 1 :(得分:0)

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

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