【发布时间】:2016-02-14 10:04:46
【问题描述】:
使用 Firebase 时,建议使用 push() 命令管理数据列表。真的很好,它为列表中推送的数据提供了一个唯一且有序的 id。
但是,当 Firebase 下线(goOffline 或 NetworkOffline)时,如果应用尝试将数据推送到列表中,则不会触发完成侦听器,直到应用重新上线:所以直到行没有唯一 id又开始了。
1/ 这是预期/正常的行为吗?
2/ 我在文档中没有看到(据我记忆),push 命令在离线状态下的工作方式不同(或仅在在线模式下)。我是否在某处漏掉了一行?
3/ 我的用例处理拥有关系的数据。这意味着我想在列表中创建一个对象(一种主对象),然后重用这个主对象 ID(由完成侦听器提供)来建立主对象和所有其他相关对象之间的关系。我该如何处理这种离线状态?
代码示例:
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Firebase(getString(R.string.firebase_url)).child("stack").push().setValue(counter++, new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
((TextView) findViewById(R.id.textView3)).setText(String.valueOf(counter) + " - " + firebase.toString());
}
});
}
});
编辑
这里有 4 种添加数据的方法:
与监听器一起推送
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Firebase(getString(R.string.firebase_url)).child("stack").push().setValue(counter++, new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
((TextView) findViewById(R.id.textView3)).setText(String.valueOf(counter) + " - " + firebase.toString());
}
});
}
});
使用监听器设置值
findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Firebase(getString(R.string.firebase_url)).child("stackManual").child(UUID.randomUUID().toString()).setValue(counter++, new Firebase.CompletionListener() {
@Override
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
((TextView) findViewById(R.id.textView4)).setText(String.valueOf(counter) + " - " + firebase.toString());
}
});
}
});
不带监听器的 SetValue
findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Firebase temp = new Firebase(getString(R.string.firebase_url)).child("stackManual").child(UUID.randomUUID().toString());
temp.setValue(counter++);
((TextView) findViewById(R.id.textView5)).setText(String.valueOf(counter) + " - " + temp.getKey().toString());
}
});
无需监听器即可推送
findViewById(R.id.button6).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Firebase temp = new Firebase(getString(R.string.firebase_url)).child("stack").push();
temp.setValue(counter++);
((TextView) findViewById(R.id.textView6)).setText(String.valueOf(counter) + " - " + temp.getKey().toString());
}
});
似乎只有当数据在服务器上的数据库中而不是在本地数据库中时才会触发侦听器! - 那是对的吗 ? - 有记录吗?
因为知道,现在构建一个直接的异步应用程序更加困难:如果离线,可能无法执行异步作业的封装,不是吗?
【问题讨论】: