在我的Firebase Android应用程序中,每当用户喜欢Post时,我需要在此用户和帖子之间创建一个链接,并增加"喜欢的数量"这个帖子(这个数字可以> 10000或更多)
根据文件。在这里:https://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions
我可以使用一个事务来增加这个计数器。
但我想启用脱机容量。
问题:在Firebase文档中,它写了" 交易不会在应用重新启动时保留"。
那么如何管理这个用例:"用户在离线时喜欢20个帖子,然后停止应用程序"?
答案 0 :(得分:3)
由于事务需要访问字段的当前值以确定字段的新值,因此在未连接到数据库服务器时无法运行事务。
出于同样的原因,Firebase客户端不会在应用重新启动时保留事务:当用户未连接时,事务的概念不能正常工作。
如果您想在未连接时记录用户操作,您应该将其存储在数据库中:用户操作。
因此,您可以为用户保留return Pick;
列表,而不是尝试使用事务增加likeCount
:
likedPosts
使用此结构,您不需要事务来增加计数器,因为每个用户基本上都与其他人隔离。
或者,您可以保留类似操作的队列:
likedPosts
uidOfTooFoo
post1: true
post3: true
uidOfTooPuf
post2: true
post3: true
使用最后一个结构,然后您将启动一个消耗此队列的小型后端服务(通过侦听likesQueue
-K234782387432
uid: "uidOfPoofoo"
post: post1
-K234782387433
uid: "uidOfPuf"
post: post2
-K234782387434
uid: "uidOfPuf"
post: post3
-K234782387434
uid: "uidOfPoofoo"
post: post3
事件或最好使用firebase-queue),然后增加共享计数器
答案 1 :(得分:1)
一种简单的方法是使用WorkManager运行事务:
即使应用程序退出或设备重新启动,WorkManager API仍可轻松安排可延迟的异步任务,这些任务有望运行。
因此保证可以运行您的交易!
示例代码:
swapaxes()
从您的活动中:
Sub main()
Dim sheetName As String
Dim lastRow, searchStartRow, orderEndRow As Long
'set the sheet name we're working in
sheetName = "Sheet1"
With Sheets(sheetName)
'find the last row containing an order
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'start search on row 2, just below the headers
searchStartRow = 2
For ctr = searchStartRow To lastRow
If (.Cells(ctr, 2).Value = True) Then 'we've found a kombi order
orderEndRow = findOrderEnd(sheetName, ctr, (lastRow))
Call sumOrder(sheetName, ctr - 1, orderEndRow)
ctr = orderEndRow 'start looking for the next order after the end row of the previous one.
End If
Next ctr
End With
End Sub
Function findOrderEnd(ByVal sheetName As String, startRow, endRow As Long)
If (startRow = endRow) Then 'we don't need to check where the end is because we've already reached the last row
findOrderEnd = endRow
Else
With Sheets(sheetName)
For ctr = startRow To endRow
If (Trim(.Cells(ctr, 2).Value) = "") Then 'the previous cell was the end
findOrderEnd = ctr - 1
Exit For
End If
Next ctr
End With
End If
End Function
Sub sumOrder(ByVal sheetName As String, startRow, endRow As Long)
With Sheets(sheetName)
.Cells(endRow, 5).Formula = "=SUM(C" & startRow & ":C" & endRow & ")"
.Cells(endRow, 6).Formula = "=SUM(D" & startRow & ":D" & endRow & ")"
End With
End Sub
就是这样。
希望有帮助!