4

我在我的Android應用程序中使用Firebase。 我的目的是,應用程序的用戶應該能夠寫入數據到數據庫,但我不希望用戶註冊,所以我使用匿名登錄。Firebase:數據庫在登錄前寫入

我有一種形式,用戶可以提交併將被提交到數據庫。在提交時,匿名登錄可能沒有完成。 Firebase中是否有可能將寫入指令稱爲數據庫,並且它是在本地編寫的並提交用戶匿名登錄的時刻?

我知道Firebase確實提供離線功能。但我假設如果我在登錄之前調用寫入數據庫,它會給我一個錯誤。

+0

這是可能的,只要到控制檯上火力,去你的項目,並設置規則如下{ 「規則」:{ 」。讀取「:」auth == null「, 」.write「:」auth == null「 } }在數據庫部分和發佈中,您將能夠存儲沒有和正在登錄的數據 –

+0

@jatDevta我知道我可以放鬆安全規則,但即使是我的應用程序的非用戶也可以寫入數據庫。我沒有問題,登錄匿名,但我是問,如果我能在某種程度上延緩寫入數據庫,直到用戶在簽署 –

回答

0

我在開發應用程序時有同樣的問題。如果用戶的電話處於飛行模式或首次啓動時處於脫機狀態,則有可能在匿名身份驗證成功完成之前達到他們需要保存數據的程度。

一種解決方法是在數據庫中創建一個「未」樹是誰寫的,但可讀只有一次驗證。當用戶通過身份驗證時,您可以將數據複製到適當的位置,並刪除未經身份驗證的區域中寫入的任何數據。你可以排隊要寫入的數據,當用戶在線火力地堡將自動寫入。

關鍵是要得到,你將作爲臨時用戶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"); 

只要網絡連接可用,您對該子項所做的任何寫入操作都將被保留。附加一個監聽器,這個臨時密鑰可能類似於下面...

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) {} 
    });