Bem*_*ish 5 android firebase firebase-security firebase-authentication firebase-realtime-database
我在我的 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");
Run Code Online (Sandbox Code Playgroud)
一旦网络连接可用,您对此子项所做的任何写入都将被保留。将侦听器附加到此临时密钥可能如下所示......
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) {}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |