我在firebase中订购了数据。订单对我来说至关重要。但是我的情况下firebase无法发送。 (PS:启用持久性。我在Android和IOS客户端尝试了这个。结果是一样的。)
首先,我收到了3件物品。
cache: 1,2,3 firebase:1,2,3
然后,我关闭了app并更新了数据(插入3项)。
cache: 1,2,3 firebase:1,2,3,4,5,6
我打开了app和 limitToLast(1)方法来获取最后一项。
cache: 1,2,3,6 firebase:1,2,3,4,5,6
错误即将来临......
我在 childAdded 事件中注册了此节点。 childAdded 回调触发了此序列:
1,2,3,6,4,5
我不想对物品进行分类。我该怎么办?
我完成了示例项目。 https://github.com/muzafferyilmaz/FirebaseOrderTesting
来自链接的github项目的相关代码段:
private ChildEventListener mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String text = dataSnapshot.getValue(String.class);
Log.i(TAG, "onChildAdded: " + text);
mAdapter.addData(text);
}
答案 0 :(得分:2)
您的问题是由于您忽略了传递给onChildAdded
的第二个参数而造成的:
void onChildAdded(DataSnapshot snapshot, String previousChildName)
previousChildName
是新孩子之后需要添加的元素的关键。忽略它,你就失去了任何订购保证。
private ChildEventListener mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String text = dataSnapshot.getValue(String.class);
Log.i(TAG, "onChildAdded: " + text + " after s");
mAdapter.addData(text);
}
然后Logcat显示:
onChildAdded: 1 after null
onChildAdded: 2 after a
onChildAdded: 3 after b
onChildAdded: 6 after c
onChildAdded: 4 after c
onChildAdded: 5 after d
如果你按顺序执行这些,你会得到:
a: 1
a: 1, b: 2
a: 1, b: 2, c: 3
a: 1, b: 2, c: 3, f: 6
a: 1, b: 2, c: 3, d: 4, f:6
a: 1, b: 2, c: 3, d: 4, e: 5, f:6
答案 1 :(得分:1)
Firebase在Indexing and Ordering上有一个由查询返回的数据的部分。根据您的数据布局,您能否按照其中一种方法进行操作?
在工厂中,我确实有以下按数据字段排序的内容。
angular.module('MyApp').factory('AllPlayers', ["FireBaseData", "$firebaseArray",
function(FireBaseData,$firebaseArray) {
var AllPlayersRef=FireBaseData.child('Players');
return $firebaseArray(AllPlayersRef.orderByChild('FirstName'));
}
]);
数据结构:
Players
- 1 (Key)
Email: ""
FirstName: "John"
LastName: "Doe"
Number: 11
- 2 (Key)
Email: ""
FirstName: "Jane"
LastName: "Smith"
Number: 15
工厂将返回我的数据,Jane Smith为第一,接着是John Doe,使用FirstName字段作为订单。
如果这不起作用,那么我会同意@Frank-van-Puffelen,需要示例代码来帮助你。