String key = databaseReference.child("Photo").push().getKey();
// ...
databaseReference.child("Photo").child(key).setValue(post);
據我所知,Firebase 在這里創建了一個統計上保證的唯一 ID,它也有一個訂單。我查了一下,確實有訂單。像這樣,它總是在資料結構的末尾插入新元素。例如像這樣:
-MqWU0En0OezPglE6SfL: true
-MqWUFoFqhIaT6fSk-DT: true
-MrmJaNZ8lbcOFPodTBO: true
變成:
-MqWU0En0OezPglE6SfL: true
-MqWUFoFqhIaT6fSk-DT: true
-MrmJaNZ8lbcOFPodTBO: true
-Mrq162Eba8KHgc_B0lh: true (New Element was inserted here at the end!)
我需要反過來。我需要在開頭插入它。有沒有辦法做到這一點?也許像push().getKeyAtBeginning()?我找不到任何東西。
如果沒有,你有什么建議?
在孩子身上,photo有成千上萬張照片。我知道您可以negativetimestamp在每張具有值的照片中插入一個子元素-1 * currentMillis,然后只需使用orderByChild(negativetimestamp). 但我認為這不是一個好主意,因為那時 Firebase 必須訂購數千甚至數萬張照片。
uj5u.com熱心網友回復:
不幸的是,你無法使用這樣的東西:
push().getKeyAtBeginning()
您不能將節點添加到特定索引。除此之外,您也無法更改Firebase 控制臺中節點的順序。默認情況下,所有節點都按鍵排序。
如果您需要按特定標準對元素進行排序,那么您的想法就是繼續前進的方式。我也回答過一個類似的問題:
- 根據 Firebase 的最新日期將資料排序到 RecyclerView
如果有數千甚至數萬張照片,那么您應該考慮將它們分成更小的塊。這種方法稱為分頁。
uj5u.com熱心網友回復:
我想了個辦法。我不知道這是否是好的風格,但它對我有用。
Firebase 使用時間戳來確保生成的密鑰的時間順序。我寫了一個方法來按字典順序反轉一個鍵(以雙射的方式),所以兩個鍵之間的所有順序關系仍然存在,但相反。因此,如果 key1 > key2,那么在 key1 < key2 之后。
我注意到在我的專案中生成的所有密鑰都包含a-z, A-Z, 0-9, -, _. 所以我只為那些字符寫了那個方法。該方法的編碼效率不高,但所有操作都是簡單的字串比較,并且我的鍵長 17 個字符,因此我最多可以進行 17*64 次字串比較,這很容易。如果您希望它更有效,請使用兩個 HashMap 而不是CHAR_INT_REPR_SPEICHERSTRING
public static final String CHAR_INT_REPR_SPEICHERSTRING = "_-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
public static String invertiereKey(String key) {
String invertiert = "";
for (int i = 0; i < key.length(); i ) {
String c = key.charAt(i) "";
invertiert = invertiereChar(c);
}
return invertiert;
}
public static String invertiereChar(String c) {
int intRepr = gibCharIntRepr(c);
// invertiere zahl
int neueRepr = 64-intRepr-1;
return gibChar_FromRepr_At(neueRepr);
}
public static int gibCharIntRepr(String c) {
if (c.length() != 1) {
return -1;
}
for (int i = 0; i < CHAR_INT_REPR_SPEICHERSTRING.length(); i ) {
String cTemp = CHAR_INT_REPR_SPEICHERSTRING.charAt(i) "";
if (cTemp.equals(c)) {
return i;
}
}
return -1;
}
public static String gibChar_FromRepr_At(int at) {
return CHAR_INT_REPR_SPEICHERSTRING.charAt(at) "";
}
我這樣使用它:
String key = databaseReference.child("Photo").push().getKey();
key = invertiereKey(key);
// ...
databaseReference.child("Photo").child(key).setValue(post);
這樣訂單確實是我需要的方式。而且由于我的映射是雙射的,因此它應該可以在沒有任何錯誤的情況下作業,在非常大的資料集上也是如此。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/395796.html
上一篇:我應該在Firebase專案中使用哪些SHA1指紋?
下一篇:計算單個物件的物件子陣列的總和
