【问题标题】:Save app data in Weather App在天气应用中保存应用数据
【发布时间】:2015-06-30 18:43:29
【问题描述】:

我正在开发一个天气应用程序,所以我必须从一些 API 获取图标(如云)和其他信息。在这里,我使用 OpenWeatherMap API。 (这部分很简单)

但问题是,如果没有网络,那么如何显示之前的数据呢?

它可能会从手机中的某个来源检索图标和数据,可能是 sqlite 数据库,或JsonStore or DictStore 或任何其他可能的有效方式。

在 sqlite 中存储图像/图标真的很痛苦,而且每次刷新应用程序时我都必须不断更改图标。(因此从数据库中存储和检索并不是一个好主意。)

我不知道如何在 JsonStore/DictStore 中保存图标/图像。 (也许是base64)

还找到了this 链接,但没有太大帮助。

欢迎任何建议或示例。

【问题讨论】:

  • 图标不是来自某个已知集合吗?为什么每次都需要得到它们?
  • 您可以在 sqlite 中使用 blob 存储类型并存储图像的字节数组。
  • @jonrsharpe 这是我获取图标conditions_image = "http://openweathermap.org/img/w/{}.png".format(data['weather'][0]['icon']) 的方式,其中data 是JSON 格式。
  • @dharms 我在 Google 上搜索了很多,并问了一个与 sqlite 和图像检索相关的问题,请参见此处:stackoverflow.com/questions/30818728/… 但如果我使用 blob 或这种方法,那么它会变得非常困难。
  • 如何将图标/json作为文件放在缓存目录中,并在互联网连接不可用时检索。当互联网连接可用时,只需用最新的 icon/json 覆盖文件的内容。

标签: android python json api kivy


【解决方案1】:

虽然我没有尝试过,但我认为您可以按照以下步骤来实现这一点。 由于您使用的是 OpenWeatherMap API,所以我假设您已经实现了一个名为 getImage(String code) 的方法,该方法将返回 byte[] 中的图标(如示例 here 中所述)。

  1. 步骤1:调用getImage后(当应用可以访问互联网时),将byte[]写入内部/外部存储中的文件,并将其命名为与WeatherId相同的名称或给它一个唯一的名称文件。您可以参考link 以便能够写入内部/外部存储。
  2. 第2步:将设备离线时想要获取的所有天气信息写入sqlite数据库。在图标列中,只需输入您在第 1 步中创建的文件的名称即可。
  3. 第三步:离线时想获取天气信息,从sqlite DB中读取数据,从天气记录中获取图标文件名,读取文件内容获取图标为byte[ ] 并使用它来显示图标。

【讨论】:

  • 感谢您的努力 :) +1,但请告诉我如何将图标保存在 json 文件中并使用 python 检索它。我在谷歌上找不到任何有用的东西。
  • @kiok46 很抱歉,但不知道 python。我只能在 java for android 上提供帮助。
【解决方案2】:

我自己想出来的。此答案供将来参考。 我所做的是将我从那个 API(已经是 JSON 格式)获得的所有数据保存到一个 json 文件中。

写入文件weather.json

import json
from urllib import urlopen

url = urlopen('http://api.openweathermap.org/data/2.5/forecast/daily?q={}&mode=json&units={}'.format(getname,temp_type)).read()
#where getname is the name of city.
#and temp_type is either C(Celsius) or F(Fahrenheit)
result = json.loads(url)
out_file = open("weather.json","w")
json.dump(result,self.out_file, indent=4)
#indent = 4, just to make it easy to read.
out_file.close()

并从文件中读取weather.json

in_file = open("weather.json", "r")
result = json.load(self.in_file)
in_file.close()

对于图标,我使用requests 模块并使用唯一名称保存每个图标,然后每次用户进行新搜索或刷新应用程序时,文件将自动更新,新图标将被下载并替换为现有的。

import requests
conditions_image1 = "http://openweathermap.org/img/w/{}.png".format(result['list'][1]['weather'][0]['icon'])
#or whatever be the name of your image
response1 = requests.get(conditions_image1)
if response1.status_code == 200:
    f = open("./icons/wc1.png", 'wb')
    f.write(response1.content)
    f.close()

而且由于我使用的是kivy,所以我想提一下,您需要在buildozer.spec 文件中添加json(因为您可能已经先在您的PC 中尝试过)

source.include_exts = py,png,jpg,kv,atlas,json 

【讨论】:

    【解决方案3】:

    在这种情况下,我真的会考虑使用托管数据库,并结合使用 Picasso(图像缓存),因此一旦从数据库接收到图标,它就会被缓存并再次使用。 Sqlite 也可以使用,但是存储图标会很痛苦,因为你必须使用效率不高的 blob

    【讨论】:

    • 毕加索缓存会在应用会话之间持续存在吗?
    • @ErrolGreen 您推荐哪个托管数据库?有免费托管吗?还有,Picasso 是否适用于 python/kivy?
    • @kiok46 我将首先学习如何使用wampserver.com/en,您可以在此服务器上进行所有测试开发,您可以在自己的计算机上托管。然后你会从那里寻找一个主机,你可以将你的测试数据库导出到。一些托管网站包括 godaddy、hostgator、1and1。此外,毕加索仅适用于 Java
    • @ErrolGreen 非常感谢您与我分享您的知识 :)
    • @ErrolGreen 很抱歉,但您的答案与 Java 相关,而不是 kivy 和 python。实际上,我的应用程序只会存储 1 或 2 KB 的数据,所以我认为我不需要服务器来完成这个小任务,我希望存储一些文件,如 jsondat 或其他格式我不知道该怎么做。
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2011-02-03
    相关资源
    最近更新 更多