Firebase如何在离线时增加计数器?

时间:2017-01-12 16:35:48

标签: android firebase firebase-realtime-database

在我的Firebase Android应用程序中,每当用户喜欢Post时,我需要在此用户和帖子之间创建一个链接,并增加"喜欢的数量"这个帖子(这个数字可以> 10000或更多) 根据文件。在这里:https://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions
我可以使用一个事务来增加这个计数器。 但我想启用脱机容量。

问题:在Firebase文档中,它写了" 交易不会在应用重新启动时保留"。

那么如何管理这个用例:"用户在离线时喜欢20个帖子,然后停止应用程序"?

2 个答案:

答案 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

就是这样。

希望有帮助!