首页 > 解决方案 > 将实时数据库 DatabaseReference.addListenerForSingleValueEvent 转换为云 Firestore

问题描述

我想将以下实时数据库代码转换为使用 Firebase:

private void setupFirebaseAuth(){
        Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");

        mAuth = FirebaseAuth.getInstance();
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        myRef = mFirebaseDatabase.getReference();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();

                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());

                    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //1st check: Make sure the username is not already in use
                            if(firebaseMethods.checkIfUsernameExists(username, dataSnapshot)){
                                append = myRef.push().getKey().substring(3,10);
                                Log.d(TAG, "onDataChange: username already exists. Appending random string to name: " + append);
                            }
                            username = username = append;

                            //add new user to the database

                            //add new user_account_settings to the database
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };
    }

其中变量定义如下:

//firebase
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseMethods firebaseMethods;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference myRef;

我可以重用其中的大部分内容,除非数据库的定义如下:

private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference myRef;

这将是:

private FirebaseFirestore db;

什么对应于 Firestore 的 DatabaseReference,因为稍后,我不知道如何将 myRef.addListenerForSingleValueEvent 调整到 Cloud Firestore

标签: androidfirebasegoogle-cloud-firestore

解决方案


addListenerForSingleValueEventCloud Firestore 中最接近的等价物是get().

关于获取数据的Firestore 文档包含这个更完整的示例:

DocumentReference docRef = db.collection("cities").document("SF");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Log.d(TAG, "DocumentSnapshot data: " + document.getData());
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

我建议查看文档并尝试一下。如果您在转换的特定步骤中遇到困难,请展示您尝试过的内容。


推荐阅读