我在我的 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/