我正在使用Firebase的Android工作。我想用數據庫中的arrayAdapter顯示信息列表。我正在使用uid的ArrayList。從結構化的,就像這樣規格化火力數據庫中獲取一些用戶信息:使用arrayAdapter顯示從多個Firebase數據庫引用獲取的數據
name : {
uid1:"bear",
uid2:"salmon"
},
phone : {
uid1:"888-395-4023",
uid2:"123-456-6789"
}
我目前的做法是將所獲取的值存儲到這樣一個類的對象的UserInfo。
public UserInfo (String name, String phone)
然後將每個對象添加到arrayAdapter。
someArrayAdapter.add(userInfo);
我的問題是有一個以上的用戶,因爲事件偵聽器回調的添加後,收到了來自超過一個參考讀取數據,我在下面的實現都在增加用戶信息字段爲空()方法調用(當接收到回調不更新數據)
private FirebaseDatabase mFirebaseDatabase = new FirebaseDatabase.getInstance();
private ValueEventListener mNameListener;
private ValueEventListener mPhoneListener;
private DatabaseReference mNameRef;
private DatabaseReference mPhoneRef;
private void getUserInfo (@NonNull final ArrayList<String> uidList)
{
// This for-loop loops through the list of strings, and use the string to construct new database references.
for (String uid : uidList)
{
// Create a new userInfo object
UserInfo userInfo = new UserInfo();
// Create a database reference for accessing the name
mNameRef = mFirebaseDatabase.getReference().child("name").child(uid);
// Create a database reference for accessing the name
mPhoneRef = mFirebaseDatabase.getReference().child("phone").child(uid);
// My name listener
mNameListener = new ValueEventListener()
{
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
String name = DataSnashot.getValue().toString();
userInfo.setName(name);
}
// ...skipped irrelevant override
}
// My phone listener
mPhoneListener = new ValueEventListener()
{
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
String phone = DataSnashot.getValue().toString();
userInfo.setPhone(phone);
// Log to try getting the phone from the object, as expected, is good
Log.i(TAG, userInfo.getPhone());
}
// ...skipped irrelevant override
}
// Attach the listeners
mNameRef.addListenerForSingleValueEvent(mNameListener);
mPhoneRef.addListenerForSingleValueEvent(mPhoneListener);
// Problem here: listener callbacks are received after this method fires.
someArrayAdapter.add(userInfo);
// Log, returns empty for both fields, and this log message runs before the callback log messages above.
Log.i(TAG, userInfo.getName() + " " + userInfo.getPhone());
}
}
我想擁有一個「完整的」用戶信息對象for循環去到下一個UID之前。而且,我應該如何管理,以便只有在接收到所有回調的情況下,適配器纔會添加userInfo對象?
我絕對需要一種更好的方式來使數據持久化,但就目前而言,如果我只能處理簡單的對象,我覺得維護更容易。感謝您的幫助和時間,請原諒我的任何語法或缺失「;」問題,我沒有寫在IDE上的示例代碼:)
感謝您的評論,但我認爲您的方法不會按比例工作。至於數據庫結構,我按照Firebase文檔中有關反規範化的最佳做法。我的實際數據庫有14個獨立的用戶字段。如果我把它們全部混雜在一起,只用一條信息查詢匹配的uid就會花費很長時間。 –
給出如圖所示的結構,但如果用戶沒有名稱,但有電話號碼會怎麼樣?電話聽衆和隨後的某些Adapater根本不會被觸發 –
這還是很好的。由於firebase的模式較少。你可以這樣做。用戶信息用戶信息=新用戶信息(名稱)。只需要一個構造函數,只需使用該名稱,並且仍然可以將該用戶信息放在同一節點下 –