首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyrebase河。检索数据访问

Pyrebase河。检索数据访问
EN

Stack Overflow用户
提问于 2019-02-23 06:22:26
回答 1查看 1.6K关注 0票数 0

我试图在我的pyrebase上使用流,但似乎我对检索的数据所能做的唯一的事情就是在控制台上打印它们。我需要更新一个全局表,或者将这些数据传递给其他函数,但是当我试图调用其他函数或实例化变量时,py魅力说是“未解决的参考”。有没有一种方法可以使用流来更新变量、表等?下面将找到我使用的函数:

代码语言:javascript
复制
 def requestHandler(message):

    print("message type", type(message))
    print("message", message)
    print("event",message["event"])  # put
    print("path", message["path"])  # /-K7yGTTEp7O549EzTYtI
    print("data", message["data"])  # {'title': 'Pyrebase', "body": "etc..."}


requests_tab = db.child("Data")).stream(requestHandler)

下面你会发现它打印出来的东西:

代码语言:javascript
复制
message type <class 'dict'>
message {'path': '/', 'data': {'start': '', 'site': '', 'end': '', 'km': '', 'task': '', 'action': '', 'date': '23.02.2019'}, 'event': 'put'}
event put
path /
data {'start': '', 'site': '', 'end': '', 'km': '', 'task': '', 'action': '', 'date': '23.02.2019'}

它似乎很好,但我可以使用strem来做其他的事情,而不仅仅是打印吗?

我已经在流之前、之后和之前打印了变量类型,在流中发生任何更改。

代码语言:javascript
复制
def printRequestTab(self):
    print("request_tab_type_stream - ", type(self.requests_tab))
    print("request_tab_stream - ", self.requests_tab)

def requestHandler(message):
    pass

requests_tab = db.child("Branch")).stream(requestHandler)

print("request_tab_type - ", type(requests_tab))
print("request_tab - ",requests_tab)
print('printRequestTab', printRequestTab)

这是变化之前的结果:

代码语言:javascript
复制
request_tab_type -  <class 'pyrebase.pyrebase.Stream'>
request_tab -  <pyrebase.pyrebase.Stream object at 0x02654F90>
printRequestTab <function RequestScreen.printRequestTab at 0x04B3E7C8>

在我打电话给printRequestTab后,requests_tab变成了空的。

代码语言:javascript
复制
request_tab_type_stream -  <class 'kivy.properties.ObservableList'>
request_tab_stream -  []

我现在放弃了。真的需要帮助。

EN

回答 1

Stack Overflow用户

发布于 2019-04-14 15:49:32

当然,您可以在任何情况下使用流处理程序。请记住,您将一个回调传递给Pyrebase,当它检测到注册路径上的更改时,它将由Pyrebase触发。

对不起,您的代码片段不清楚或不完整。

尝试下面的例子,根据您的需要对其进行调整:

代码语言:javascript
复制
class MyStuffTracker(object):
    """Tracks changes of my stuff in Firebase"""
    _db = pyrebase.initialize_app({
        "apiKey": "YOUR-apiKey",
        "authDomain": "YOUR-authDomain",
        "databaseURL": "YOUR-databaseURL",
        "storageBucket": "YOUR-storageBucket",
        "serviceAccount": "YOUR-serviceAccount",
    }).database()

    my_stuff: List[dict] = None  # In my example my data is a list of some dictionaries

    @property
    def is_ready(self) -> bool:
        """
        Returns:
            bool: True if my stuff is ready for use
        """
        return self.my_stuff is not None

    def stream_handler(self, message):
        print("Got some update from the Firebase")
        # We only care if something changed
        if message["event"] in ("put", "patch"):
            print("Something changed")
            if message["path"] == "/":
                print("Seems like a fresh data or everything have changed, just grab it!")
                self.my_stuff: List[dict] = message["data"]
            else:
                print("Something updated somewhere, I dont't care I just want the latest snapshot of my stuff")
                # Just get whole-data of my stuff and list (second) item of the pyres (that I expect to be a dict)
                self.my_stuff: List[dict] = list(it.item[1] for it in self._db.child("my_stuff").get().pyres)

    def __init__(self) -> None:
        """Start tracking my stuff changes in Firebase"""
        super().__init__()
        self._db.child("my_stuff").stream(self.stream_handler)


tracker = MyStuffTracker()

while not tracker.is_ready:
    pass  # Just wait until the first snapshot of my stuff will be ready

print(f"My stuff is: {tracker.my_stuff}")

在本例中,MyStuffTracker有一个私有的_db,一个初始化的Firebase DB,一个方法stream_handler,如果数据内部发生了一些嵌套的更改,它只会存储新的数据或再次提取数据,并有一个关于如何在数据的第一个快照可用后启动和使用它的基本示例(以避免在初始化数据之前访问它)。

希望它对你有用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54838847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档