本地sql和服务器数据库之间的同步

时间:2013-11-24 20:04:14

标签: android

希望你做得好。 我正在开发一个Android应用程序,我需要在本地SQL和服务器上的数据库之间进行同步。 我在服务器端使用PHP(JSON用于检索日期)。 我的问题是,当我第一次启动应用程序时,是下载服务器上的数据,然后当我第二次启动它时,数据再次下载,有时会发生,有时不会! 当添加新数据时,它会被下载,但问题仍然存在,数据会被复制。 当我在手机上试用应用程序时,数据会被下载一次,但是在添加新数据时,它不会被下载! 这是我的代码。

protected Void doInBackground(Void... uri) {
        myDatabaseHandler.openToRead();
        Cursor cursor = myDatabaseHandler.queueBranchId();
        try {
            HttpParams params = new BasicHttpParams();
            HttpConnectionParams.setSoTimeout(params, 0);
            HttpClient httpClient = new DefaultHttpClient(params);

            //prepare the HTTP GET call 
            HttpGet httpget = new HttpGet("http://restaurants.bugs3.com/branches.php");
            //get the response entity
            HttpEntity entity = httpClient.execute(httpget).getEntity();

            if (entity != null) {
                //get the response content as a string
                String response = EntityUtils.toString(entity);
                //consume the entity
                entity.consumeContent();

                // When HttpClient instance is no longer needed, shut down the connection manager to ensure immediate deallocation of all system resources
                httpClient.getConnectionManager().shutdown();

                //return the JSON response
                JSONObject object = new JSONObject(response.trim());
                JSONArray jsonArray = object.getJSONArray("branches");
                if(jsonArray != null) {
                   for(int i = 0 ; i < jsonArray.length() ; i++) {
                            JSONObject object1 = (JSONObject) jsonArray.get(i);
                            int server_branch_id = object1.getInt("server_branch_id");
                            String branch_name = object1.getString("branch_name");
                            double branch_lat = object1.getDouble("branch_lat");
                            double branch_lon = object1.getDouble("branch_lon");
                            double distance = object1.getDouble("distance");
                            String restaurant_name = object1.getString("restaurant_name");
                            boolean exist = false;
if (cursor.moveToFirst())
                            {
                                do
                                {
                                    try
                                    {
                                        if (server_branch_id == cursor.getInt(cursor.getColumnIndex(DatabaseHandler.KEY_LOCAL_BRANCH_ID)))
                                        {
                                            exist = true;
                                        }
                                    }
                                    catch(Exception e)
                                    {   
                                    }
                                }while(cursor.moveToNext());
                                cursor.close();
                            }
                            myDatabaseHandler.close();

                            if (!exist)
                            {
                                myDatabaseHandler.openToWrite();
                                myDatabaseHandler.insertBranchWithID(server_branch_id, branch_name, restaurant_name, branch_lat, branch_lon, distance);
                                myDatabaseHandler.close();
                            }

                   }}catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

1 个答案:

答案 0 :(得分:0)

可能有一些解决方法。我可以建议两种不同的方式(假设你有一个特定的id用于你下载的任何项目):

  1. 跟踪本地sql的最后一个ID,在应用启动时,询问服务器是否有更新的ID以及是否有下载它们。通过这种方式,您可以避免复制。
  2. 对表使用主键约束,对于插入使用insertWithOnConflict(...,CONFLICT_IGNORE)。如果存在不同的内容,此方法将不会复制任何相同的ID并插入。
  3. 希望这有帮助