#java #android #json #sqlite #http
#java #Android #json #sqlite #http
Вопрос:
В моем приложении я создаю базу данных SQLite. Затем я заполняю его данными JSON, полученными из URL, используя экземпляр класса HttpAsyncTask в моей основной деятельности. Это работает нормально, но я также хочу обновить базу данных. Новые данные (одна строка в базе данных) добавляются на страницу URL один раз в день, и я хочу реализовать кнопку «синхронизировать» в приложении, которая обновляет базу данных только новой информацией. Могу ли я получить несколько советов о том, как это сделать? Моя HttpAsyncTask приведена ниже, если это поможет — я думаю, мне может понадобиться предложение if / else в методе onPostExecute(), который добавляет все строки, только если база данных создается в первый раз. Я думал о попытке поместить класс HttpAsyncTask в мой DatabaseHelper, но это на самом деле не имеет смысла.
private class HttpAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String...urls) {
return GET(urls[0]);
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject main = new JSONObject(result);
JSONObject body = main.getJSONObject("body");
JSONArray measuregrps = body.getJSONArray("measuregrps");
// get measurements for date, unit, and value (weight)
for (int i = 0; i < measuregrps.length(); i ) {
JSONObject row = measuregrps.getJSONObject(i);
// a lot of getting amp; parsing data happens
db.addEntry(new Entry(date, weight, null, null));
//adds all the lines every time this is run, but I only want to add all
//the lines once and then add new rows one by one from there
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
public static String GET(String url) {
InputStream is = null;
String result = "";
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
HttpResponse httpResponse = client.execute(get);
is = httpResponse.getEntity().getContent();
if (is != null)
result = convertInputStream(is);
else
result = "Did not work!";
} catch (Exception e) {
Log.d("input stream", e.getLocalizedMessage());
}
return resu<
}
private static String convertInputStream(InputStream is) throws IOException {
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = "";
while((line = reader.readLine()) != null)
builder.append(line);
is.close();
return builder.toString();
}
Ответ №1:
Ваша реализация полностью зависит от требований проекта. Если на сервере постоянно происходят изменения, правильным способом реализации процесса синхронизации является:
1. Внедрите процесс синхронизации, который работает полностью в фоновом режиме. Эта синхронизация будет настроена для вызова определенных вызовов API / классов служб, которые потребуются для синхронизации.
2. Сервер запросит мобильный клиент об изменении данных.
3. Чтобы получать обновления сервера, будет запущена постоянно работающая служба / синхронизация с некоторыми предопределенными интервалами, которая проверяет наличие обновлений или реализует GCM.
Адаптер синхронизации был бы лучшим для служб синхронизации. Ооо, также не забудьте применить поставщика контента, поскольку вызовы базы данных будут выполняться одновременно как из пользовательского интерфейса, так и из фона.
Надеюсь, это поможет решить.
Комментарии:
1. Извините, я не должен был говорить постоянно. Я хочу получать новые данные и обновлять базу данных только тогда, когда пользователь нажимает кнопку «синхронизировать». Я чувствую, что это должно быть легко — если на веб-сайте на две строки данных больше, чем количество строк в моей базе данных, добавьте две строки самых последних данных. Я просто не уверен, куда поместить этот код.
2. Создайте класс обслуживания в Infra, вызывайте в соответствии с вашими требованиями.
Ответ №2:
Вы должны проверить, есть ли аналогичные данные, доступные в таблице, если да, обновите таблицу, а если нет, вставьте новые данные в таблицу