- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个基于 Java 和 Firebase
的原生 Android 应用程序,该应用程序需要根据某些操作多次写入(使用 SingleValueEventListener
或事务)到不同的实时数据库引用。它是这样的:
What do I need?
仅在我尝试更新的第一个位置成功后,才更新第二个数据库位置。这些位置有助于并发更新。
初步研究:
我查看了有关数据库回滚、并发更新、多位置更新、数据库规则和安全性的各种帖子和堆栈溢出问题,但没有一个对我的事业有所帮助。
我查看了哪些资源?
Firebase undoable update , Firebase commit rollback , Firebase multi-write , Firebase multi-location updates
问题是什么?
引用的更新没有问题。问题在于,如果 DB 引用 1 更新成功,而 DB 引用 2 更新失败,那么我无法将 Ref 1 回滚到之前的状态。
是否需要这种方法?
不幸的是,就我而言,是的。
有哪些解决方案?
我可以存储 Ref 1 的先前状态,如果 Ref 2 的更新失败,我可以重写 Ref 1 的先前状态。但是这些位置支持并发更新,当我回滚到以前的状态时,以前的状态也可能已经更新。以前的数据可能会变得陈旧,并且用该数据覆盖 ref 可能会导致数据丢失。解决所有这些需要代码中不需要的复杂性的问题可能根本无法保证解决问题。
Transactions 肯定会尝试更新 Ref 2 直到成功,但直到某个时间,并且可能是由于网络连接丢失导致无法在第二个位置写入,这部分解释了我的关注。
另一种选择是更改数据库设计并将所有多个数据库引用移动到一个位置,这样如果位置更新失败,则不会根据 Firebase 进行任何更改。但是,我设计数据库的方式似乎没问题。事实上,为了便于消除这个问题,如果我改变我的数据库结构,把东西转移到一个单一的位置,那对我来说是绝对错误的。用类似的情况来解释这一点,例如,在 StackOverflow 中,如果我对一个答案投赞成票,则回答者的声誉会发生变化,答案的状态会根据所涉及的人和票数发生变化, Activity 投票的人改变了,也可能是他的声誉。现在无法将上述所有 DB 引用合并为一个。
问题与 SingleValueEventListeners 或 Transactions 无关。
案例的简单代码示例,问题出在哪里?
为了简单起见,下面说明了一个 2 级深度嵌套的 EventListener(同样适用于事务)。
ValueEventListener outerListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//do something
//update DBRefOne
DBRefOne.updateChildren(newOuterValue, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
ValueEventListener innerListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//do something
//update DBRefTwo
DBRefTwo.updateChildren(newInnerValue);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// log error
}
};
DBRefTwo.addListenerForSingleValueEvent(innerListener);
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// log error
}
};
DBRefOne.addListenerForSingleValueEvent(outerListener);
这对我来说是一个非常重要但棘手的问题,需要解决,因为大多数应用程序都是以其他方式完成的。我愿意根据您的建议进行返工。请随时提出建议,我们将以谦逊和感激之情感激任何帮助。
最佳答案
有两种事务更新数据的方法:
没有隐藏的第三种方式,所以如果你想以事务方式更新数据,你将不得不使用其中一种方式。
如果您写入的值不是基于当前值,您应该使用多位置更新,因为它具有更好的性能特征。有关更多信息,请阅读此博客文章:Client-side fan-out for data consistency .
如果您写入的值基于当前值,则需要使用事务。在这种情况下,确保您写入的数据在 JSON 中彼此靠近很重要,因为您实际上是在更新位置的顶部放置了一个(乐观的)锁。
关于java - 当单值事件或事务的嵌套 ValueEventListener 失败时,如何回滚到 Firebase Realtime DB for Android 中的先前状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50153919/
我有一个 Firebase valueEvent 监听器: questions.orderByChild("CategoryID").equalTo(categoryID)
我正在使用 ValueEventListeners 从 Firebase 数据库中检索数据。现在我想从查询中删除 ValueEventListener。像这样: query.removeEventLi
出于某种原因,当我在 fragment 中调用 getTitle() 时,它总是返回 null。似乎根本没有添加 ValueEventListener。 当我在监听器内调试或打印 title 的值时,
单击按钮后,我需要从 Firebase 实时数据库获取昵称值。所以我在按钮的 onClick 方法中创建了 singleValueListner() 。但这不起作用。 我尝试过调试它,但代码没有进入s
值事件监听器在每个 Activity 中都正常工作。但在我的注册 Activity 中,花费了超过 2 分钟。我不知道为什么。 这是我的方法 private void verifyuserinpu
我有一个 valueEventListener() 用于从 Firebase 获取数据。 这是第一个。 sectionReference.child(classID).addValueEventLis
我有这个标准的 Firebase 调用: ref.child("user/toys/-K2873267832") .addListenerForSingleValueEvent(new Valu
应用说明 我的应用程序从 Firebase 数据库中检索数据。首先,我将 java 对象正确推送到数据库,并且可以毫无问题地检索数据,使用 Fragments onActivityCreated 中的
我有一个名为“bg”的全局变量。它在 firebase 数据库引用“myRef”的 ValueEventListener 中初始化 但是如果我尝试在 valueeventlistener block
DatabaseReference Ref = FirebaseDatabase.getInstance().getReference(Constants.Client + "/" + path);
我正在尝试使用信号量来等待我的 firebase valueEventListener。我有一个用户信息 Activity ,其中包含用户必须填写的 6 个不同字段。当用户保存他/她的信息时,我想进行
我正在尝试从 Firebase 获取字符串列表,只有在检索到所有数据后,我才会更新我的 UI。目前我在 fragment 类中使用以下代码来实现此目的。 taskList = new ArrayLis
在我下面的代码中,函数 setPhoto(url) 始终接收空 url,但如果我通过单击按钮调用另一个函数并且它需要该 url,它就会正确接收数据。 @Override protected void
我正在尝试使用代码 straight from their documentation 从 Firebase 数据库中读取数据。我的代码如下,当我尝试将 ValueEventListener 添加到我
我有一个使用 Google Firebase 的 Android 应用。 我需要下载带有随机 ID 的图像。 我有一个函数必须返回随机图片的位图。在此函数中,我从单独的数据库条目中读取图片数量,然后生
我正在尝试检测 Firebase 数据库中的值更改。这是我初始化 ValueEventListener 的代码: valueEventListener = new ValueEventListener
我的 Android 应用中遇到了 Firebase 实时数据库的问题。 我正在尝试的是实时更新列表。但更新仅适用于应用程序启动。它不会自动更新。因此,我需要在需要更新时重新启动应用程序。 有没有遗漏
我正在尝试使用接口(interface)异步检查我的 Firebase 数据库中的条目,但我不确定如何以与密码和电子邮件相同的方式实现它。 例子: if (TextUtils.isEmpty(pass
我已经追踪我的代码找到崩溃的根本原因,显然这个构造函数无法更新类的变量。当我试图从此类获取数据时出现空指针异常。您可以安全地假设记录已经在数据库中,它所要做的只是获取数据并将其放入类/对象中。我现在只
我试图返回一个 bool 值,但返回的值始终为 false,即在本例中为 0。 检查变量是一个实例变量,按下按钮时将调用以下函数。 private boolean checkAnswerSubmiss
我是一名优秀的程序员,十分优秀!