2015-06-30 2 views
0

Я работаю над погодным приложением, поэтому мне нужно получить значки (например, облака) и другую информацию из некоторого API. Здесь я использую API OpenWeatherMap. (Эта часть проста)Сохранить данные приложения в приложении погоды

Но проблема в том, что если Интернет недоступен, то как мне отображать предыдущие данные ?.

Он может извлекать иконки и данные из какого-либо источника в телефоне, может быть база данных SQLite или JsonStore or DictStore или любой другой эффективный способ, если это возможно.

Сохранение изображения/значок в SQLite является настоящей головной болью, а также я должен продолжать изменять иконки приложений каждый раз обновляется. (Таким образом, хранение и извлечение из базы данных не будет хорошей идеей.)

I не знаю, как сохранять значки/изображения в JsonStore/DictStore. (возможно, base64)

Также найдено this ссылка, но не очень полезна.

Любые советы или примеры приветствуются.

+0

Wouldn» t значки из какого-то известного набора; зачем вам их каждый раз получать? – jonrsharpe

+0

Вы можете использовать тип памяти blob в sqlite и хранить массив байтов изображений. – dharms

+0

@jonrsharpe Вот так я получаю значки 'conditions_image =" http://openweathermap.org/img/w/{}.png".format(data['weather'][0]['icon ']) 'где' data' находится в формате JSON. – kiok46

ответ

0

Я понял это сам. Этот ответ для будущих ссылок. Что я сделал, сохранил все данные, которые я получил от этого 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 файл (как вы могли бы попробовал его на вашем компьютере первый)

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

В этой ситуации я бы предпочел использовать размещенную базу данных, используя комбинацию использования Picasso (кэширования изображений), чтобы после того, как значок, полученный из базы данных, был кэширован и использован в другое время. Sqlite также может использоваться, но сохранение значков будет огромной болью, так как вам придется использовать blob, который не очень эффективен.

+0

Будет ли сохраняться кеширование Пикассо между сеансами приложений? – dharms

+0

@dharms да это будет –

+0

@ErrolGreen Какую размещенную базу данных вы рекомендуете? Есть ли бесплатный хостинг? А также, работает ли Picasso с python/kivy? – kiok46

1

Хотя я еще не пробовал, но думаю, вы можете выполнить следующие шаги, чтобы достичь этого , Поскольку вы используете API OpenWeatherMap, я предполагаю, что вы реализовали метод с именем getImage(String code), который вернет значок в байте [] (Как упоминалось в примере here).

  1. Шаг 1: После вызова GetImage (если приложение может получить доступ к Интернету), записать байт [] в файл во внутреннем/внешнем накопителе и назовите его так же, как в WeatherId или дать некоторое уникальное имя к файлу. Вы можете обратиться к link, чтобы иметь возможность писать во внутреннее/внешнее хранилище.
  2. Этап 2: Напишите всю информацию о погоде, которую вы хотите получить, когда устройство отключено от базы данных sqlite. В столбце значков просто поместите имя файла, который вы создали на шаге 1.
  3. Шаг 3: Когда вы в автономном режиме и хотите получить информацию о погоде, прочитайте данные из базы данных sqlite, получите файл значка имя из записи погоды и прочитать содержимое файла, чтобы получить значок в виде байта [], и использовать его для отображения значка.
+0

Спасибо за ваши усилия :) +1 за это, но, пожалуйста, расскажите, как сохранить значок в файле 'json' и получить его с помощью' python'. Я не нашел ничего полезного в Google. – kiok46

+0

@ kiok46 Извините, но понятия не имею о python. Я могу помочь только для java для Android. – Sush

Смежные вопросы