在Weather App

时间:2015-06-30 18:43:30

标签: android python json api kivy

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

但问题是,如果互联网不可用,那么我该如何显示以前的数据呢?

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

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

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

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

欢迎任何建议或示例。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我自己想通了。这个答案是为了将来的参考。 我所做的是,将我从该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,所以我想提一下,你需要在json文件中添加buildozer.spec(因为你可能先在PC上试过)

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

答案 2 :(得分:0)

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