gpt4 book ai didi

android - 如何处理Firebase离线模式和数据推送?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:17 24 4
gpt4 key购买 nike

使用Firebase时,推荐使用push()命令来管理数据列表。这真的很好,它为推送到列表中的数据提供了一个唯一且有序的 ID。

但是,当 Firebase 离线时(goOffline 或 NetworkOffline),如果应用程序尝试将数据推送到列表中,则不会触发完成监听器,直到应用程序重新在线:所以直到该行没有唯一 ID又开始了。

1/这是预期的/正常的行为吗?

2/我没有在文档中看到(据我所知)推送命令在离线状态下的工作方式不同(或仅在在线模式下)。我是不是漏掉了某行?

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

});
}
});

SetValue with Listener

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

});

似乎仅当数据位于服务器上的数据库中而不是本地数据库中时才会触发监听器!- 那是对的吗 ?- 有记录吗?

因为知道,现在构建简单的异步应用程序更加困难:如果离线,可能无法执行异步作业的封装,对吗?

最佳答案

so there is no unique id until the line is on again

这最后一个陈述是真的。 Firebase 推送 ID 是在客户端生成的,并且在统计上保证是唯一的。

您可以通过拆分操作轻松地检查这一点:

Firebase ref = new Firebase(getString(R.string.firebase_url));
Firebase newStackRef = ref.child("stack").push();
System.out.println("New key/push id: "+newStackRef.key());
newStackRef.setValue(counter++, new Firebase.CompletionListener() {

即使您未连接到网络,日志输出也会向您显示新的推送 ID。

IT APPEAR THAT THE LISTENERS ARE TRIGGERED ONLY WHEN THE DATA ARE IN THE DATABASE ON THE SERVER, AND NOT ON THE LOCAL DB! IS THAT CORRECT ?

完成监听器只会在数据提交到服务器后触发。

来自guide on saving data :

If you'd like to know when your data has been committed, you can add a completion listener. Both setValue() and updateChildren() take an optional completion listener that is called when the write has been committed to the database.

但是,本地和远程编辑都会触发常规事件监听器(如使用 addValueEventListener() 创建的事件监听器)。这些是您应该用来呈现 UI 等的监听器。

关于android - 如何处理Firebase离线模式和数据推送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33682329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com