android - Firebase:登录前写入数据库

标签 android firebase firebase-realtime-database firebase-authentication firebase-security

我在我的 Android 应用程序中使用 Firebase。 我的目的是应用程序的用户应该能够将数据写入数据库,但我不希望用户注册,所以我使用匿名登录。

我有一个表单,用户可以提交该表单并将提交给数据库。在提交时,匿名登录可能尚未完成。 我是否可以在 Firebase 中调用写入数据库的指令,它是在本地写入的,并在用户匿名登录时提交?

我知道 Firebase 确实提供离线功能。但我假设如果我在登录前调用 write database,它会给我一个错误。

最佳答案

我在开发应用程序时也有同样的担忧。如果用户的手机处于飞行模式或在首次启动时处于离线状态,则在匿名身份验证成功完成之前,他们可能会到达需要保存数据的地步。

解决方法是在您的数据库中创建一个“未经身份验证”的树,任何人都可以写入,但只有在经过身份验证后才能读取。当用户通过身份验证后,您可以将数据复制到适当的位置并删除任何写入未验证区域的数据。您可以将要写入的数据排队,Firebase 会在用户在线时自动写入。

诀窍是在未经身份验证的树中获取一个推送 ID,您将用作临时用户 ID。该值应使用 SharedPreferences 或您选择的其他方法保存在本地。

    db = FirebaseDatabase.getInstance();
    db.setPersistenceEnabled(true);

    dbRef = db.getReference();

    // This key should be saved on the user's device until authenticated
    String key = dbRef.child("unauthenticated").push().getKey();

    // Write some data 
    dbRef.child("unauthenticated").child(key)
         .child("somedata").setValue("testing");

一旦网络连接可用,您对这个 child 所做的任何写入都将被保留。将监听器附加到此临时 key 可能如下所示...

    dbRef.child("unauthenticated").child(key).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d("DB", "Got value from database: " + dataSnapshot.child("somedata").getValue());

            if(FirebaseAuth.getInstance().getCurrentUser() != null) {
                /** If user is authenticated, move data to authenticated location **/
            }
        }
        @Override public void onCancelled(DatabaseError databaseError) {}
    });

关于android - Firebase:登录前写入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40576291/

相关文章:

android - 如何调整框架布局的权重?

android - 注释处理器现在必须明确标示

firebase - flutter firebaseauth signout() 不起作用

firebase - 无法从Firebase读取List,始终在snapshot.data上返回null

java - 如何获取父节点的值作为字符串?

android - TextView - 分割线

来自父类(super class)的 Java 子类构造函数

Firebase身份验证(电子邮件/密码)如何设置用户的uid?

javascript - 问题在循环中构造一个 promise

android - Firebase检索当前子项然后将其设置为另一个Android子项的子项