Java 从URL获取JSON数据并重复更新SQLite数据库

Java 从URL获取JSON数据并重复更新SQLite数据库,java,android,json,sqlite,http,Java,Android,Json,Sqlite,Http,在我的应用程序中,我创建了一个SQLite数据库。然后,我在主活动中使用HttpAsyncTask类的实例使用从URL获取的JSON数据填充它。这很好,但我还想更新数据库。每天向URL页面添加一次新数据(数据库中的一行),我想在应用程序中实现一个“同步”按钮,只使用新信息更新数据库。我能得到一些关于如何做的建议吗?下面是我的HttpAsyncTask,如果有帮助的话-我想我可能需要onPostExecute()方法中的if/else子句,它只在第一次创建数据库时添加所有行。我曾想过尝试在我的Da

在我的应用程序中,我创建了一个SQLite数据库。然后,我在主活动中使用HttpAsyncTask类的实例使用从URL获取的JSON数据填充它。这很好,但我还想更新数据库。每天向URL页面添加一次新数据(数据库中的一行),我想在应用程序中实现一个“同步”按钮,只使用新信息更新数据库。我能得到一些关于如何做的建议吗?下面是我的HttpAsyncTask,如果有帮助的话-我想我可能需要onPostExecute()方法中的if/else子句,它只在第一次创建数据库时添加所有行。我曾想过尝试在我的DatabaseHelper中放置一个HttpAsyncTask类,但这并没有真正意义

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 & 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 result;
}

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();
}
私有类HttpAsyncTask扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
返回GET(url[0]);
}
@凌驾
受保护的void onPostExecute(字符串结果){
试一试{
JSONObject main=新的JSONObject(结果);
JSONObject body=main.getJSONObject(“body”);
JSONArray measuregrps=body.getJSONArray(“measuregrps”);
//获取日期、单位和值(重量)的测量值
对于(int i=0;i
您的实施完全取决于项目要求。 如果服务器上不断发生更改,则执行同步过程的正确方法是:

一,。 实现同步过程,它完全在后台工作。此同步将定制为调用同步所需的特定API调用/服务类

二,。 服务器将提示移动客户端更改数据

三,。 要获取服务器更新,将以预定义的间隔运行连续运行的服务/同步,并检查更新或实施GCM

同步适配器将是同步服务的最佳选择。 哦,也别忘了应用内容提供者,因为从UI和后台调用数据库是并发的


希望这有助于作出决定

您必须检查表中是否有类似的可用数据,如果是,请更新表,如果否,请向表中插入新数据

对不起,我不应该一直这样说。我只想在用户按下“同步”按钮时获取新数据并更新数据库。我觉得这应该很容易——如果网站的数据行数比我数据库中的行数多出两行,那么添加两行最新的数据。我只是不知道该把代码放在哪里。在Infra下创建服务类,根据需要调用。