2015-07-18 4 views
-2

Я разрабатываю приложение для Android. Я использовал xampp-сервер для использования mysql.Когда я запускаю приложение, он должен синхронизировать с mysql и возвращать значения и хранить его в sqlite. Я пробую этот пример в ссылке http://programmerguru.com/android-tutorial/how-to-sync-remote-mysql-db-to-sqlite-on-android/. Точно так же я разработал код, но в примере, как в ссылке, которую я использовал, есть столбец с именем syncsts в mysql, чтобы отслеживать синхронизацию. Но проблема в синхронизации обновляется, когда один пользователь использует приложение, а статус получает updated.Again, если другой пользователь использует приложение, тогда синхронизация не происходит.синхронизация между mysql и sql сервером для нескольких пользователей

Мои сомнения

  1. Я хочу, чтобы синхронизировать таким образом, что когда несколько пользователей использовать приложение синхронизации между MySQL и SQLite должно произойти каждый раз, и несколько пользователей должны получить доступ к app.How ли я изменить мой код для этого.
  2. Я использую localhost здесь, проблема хорошо работает с эмулятором, но при попытке с реальным устройством это не работает. Только когда компьютер и мобильный телефон находятся в одной сети, он работает. Я хочу, чтобы несколько пользователей использовали приложение с другой сетью. Как я сделать this.please помочь

Мой код

MainActivity.java

public class MainActivity extends Activity implements OnClickListener 
{ 
TextView update,updating; 
Button btn1,btn2; 
HashMap<String, String> queryValues; 
DBController controller = new DBController(this); 


@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 




    AsyncHttpClient client = new AsyncHttpClient(); 
    RequestParams params = new RequestParams(); 

    client.post("http://192.168.1.104/website/getdbrowcount.php",params ,new AsyncHttpResponseHandler() { 
      @Override 
      public void onSuccess(String response) 
      { 
       System.out.println(response); 
       try 
       {     
        Log.d("home", "success"); 
        // Create JSON object out of the response sent by getdbrowcount.php 
        JSONObject obj = new JSONObject(response); 
        Log.d("home", obj.toString()); 
        System.out.println(obj.get("count"));   
        // If the count value is not zero, 
        if(obj.getInt("count") != 0) 
        { 
         Log.d("home", "count not equal to zero"); 
         AlertDialog.Builder myalert=new AlertDialog.Builder(MainActivity.this); 
         myalert.setTitle("New product data available"); 
         Log.d("home", "count"); 
         myalert.setMessage("New product data is available.Would you like to download and update?"); 
         myalert.setPositiveButton("ok", new DialogInterface.OnClickListener() 
         { 

          @Override 
          public void onClick(DialogInterface dialog, int arg1) 
          { 
           // TODO Auto-generated method stub 

           // Transfer data from remote MySQL DB to SQLite on Android and perform Sync 
           syncDB(); 
           update.setText("Started syncing to server"); 
           btn2.setVisibility(View.VISIBLE); 
          } 
         }); 


         myalert.setNegativeButton("cancel", new DialogInterface.OnClickListener() 
         { 

          @Override 
          public void onClick(DialogInterface dialog, int arg1) 
          { 
           // TODO Auto-generated method stub        
           update.setText("The update has been cancelled. Please update via Settings to work" 
             + " with latest Sonetonix product data"); 
           btn1.setEnabled(true); 
           btn1.setTextColor(Color.parseColor("#FFFFFF")); 
           btn2.setVisibility(View.GONE); 

          } 
         }); 
         myalert.show(); 
        } 
        else 
        { 
         Log.d("home", "count is equal to zero"); 
         update.setText("New Products are not available. Please keep updating for the new products.."); 
         btn1.setEnabled(true); 
         btn1.setTextColor(Color.parseColor("#FFFFFF")); 
         btn2.setVisibility(View.GONE); 
        } 

       } 
       catch (JSONException e) 
       { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } 
      } 

      public void onFailure(int statusCode, Throwable error,String  content) 
      { 

} 
     }); 

} 

public void syncDB() 
{ 
    Log.d("home", "db sync"); 

    // Create AsycHttpClient object 
    AsyncHttpClient client = new AsyncHttpClient(); 
// Http Request Params Object 
    RequestParams params = new RequestParams(); 

    client.post("http://192.168.1.104/website/getusers.php", params, new AsyncHttpResponseHandler() 
    { 
     @Override 

     public void onSuccess(String response) 

     { 

      // Update SQLite DB with response sent by getusers.php 
      updatesqlite(response); 
     } 



     // When error occured 
     @Override 
     public void onFailure(int statusCode, Throwable error, String content) 
     { 

     } 
    }); 

    } 

public void updatesqlite(String response) 
{ 

    Log.d("home",response); 
    ArrayList<HashMap<String, String>> usersynclist; 
    usersynclist = new ArrayList<HashMap<String, String>>(); 


    // Create GSON object 
    Gson gson = new GsonBuilder().create(); 
    try 
    { 
     // Extract JSON array from the response 
     JSONArray arr = new JSONArray(response); 
     System.out.println(arr.length()); 
    // If no of array elements is not zero 
     if(arr.length() != 0) 
     {    
      for (int i = 0; i < arr.length(); i++) 
      { 
       // Get JSON object 
       JSONObject obj = (JSONObject) arr.get(i); 
       System.out.println(obj.get("productId")); 
       System.out.println(obj.get("category")); 
       System.out.println(obj.get("subcategory")); 
       System.out.println(obj.get("mountingstyle")); 
       System.out.println(obj.get("products")); 
       System.out.println(obj.get("description")); 

      // DB QueryValues Object to insert into SQLite 
       queryValues = new HashMap<String, String>(); 
       queryValues.put("productId", obj.get("productId").toString()); 
       queryValues.put("category", obj.get("category").toString()); 
       queryValues.put("subcategory", obj.get("subcategory").toString()); 
       queryValues.put("mountingstyle", obj.get("mountingstyle").toString()); 
       queryValues.put("products", obj.get("products").toString()); 
       queryValues.put("description", obj.get("description").toString()); 

       // Insert User into SQLite DB 
       controller.insertUser(queryValues); 

       Log.d("home","inserted properly"); 

       HashMap<String, String> map = new HashMap<String, String>(); 
       // Add status for each User in Hashmap 
       Log.d("home",map.toString()); 

       map.put("products", obj.get("products").toString()); 
       map.put("status", "1"); 
       usersynclist.add(map); 

       System.out.println("---------------------------------------------" + usersynclist); 
       Log.d("home",map.toString()); 
       Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() 
       { 
         @Override 
         public void run() 
         { 
         //Do something after 100ms 

         } 
        }, 4000); 
      } 

     // Inform Remote MySQL DB about the completion of Sync activity by passing Sync status of Users 
      updatesyncsts(gson.toJson(usersynclist)); 

     // Reload the Main Activity 
      reloadActivity(); 
     } 

    } 
    catch (JSONException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 


// Method to inform remote MySQL DB about completion of Sync activity 
public void updatesyncsts(String json) 
{ 

    System.out.println(json); 
    AsyncHttpClient client = new AsyncHttpClient(); 
    RequestParams params = new RequestParams(); 
    params.put("syncsts", json); 
    System.out.println(params); 
    // Make Http call to updatesyncsts.php with JSON parameter which has Sync statuses of Users 
     client.post("http://192.168.1.104/website/updatesyncsts.php", params, new AsyncHttpResponseHandler() 
     { 
      @Override 
      public void onSuccess(String response) 
      { 
       Log.d("home",response); 
       btn2.setVisibility(View.GONE); 
       btn1.setEnabled(true); 
       btn1.setTextColor(Color.parseColor("#FFFFFF")); 
      } 

      @Override 
      public void onFailure(int statusCode, Throwable error, String content) 
      { 

      } 

     }); 
} 

// Reload MainActivity 
public void reloadActivity() 
{ 
    Intent objIntent = new Intent(getApplicationContext(), MainActivity.class); 
    startActivity(objIntent); 
    update.setText("Updated successfully"); 
} 

} 

DBController.java

public class DBController extends SQLiteOpenHelper 
{ 
private static final String DATABASE_NAME = "SonetonixProducts.db"; 
private static final int DATABASE_VERSION = 1; 


public DBController(Context context) 
{ 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    Log.d("home",DATABASE_NAME); 

} 

@Override 
public void onCreate(SQLiteDatabase database) 
{ 

    String query; 
    query="CREATE TABLE guide (slno INTEGER PRIMARY KEY AUTOINCREMENT, productId INTEGER, category TEXT, subcategory TEXT, mountingstyle TEXT, products TEXT, description TEXT)"; 
    // TODO Auto-generated method stub 
    database.execSQL(query); 
    Log.d("home","table created"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) 
{ 
    // TODO Auto-generated method stub 
    String query; 
    query= "DROP TABLE IF EXISTS guide"; 
    database.execSQL(query); 
    onCreate(database); 
} 

public void insertUser(HashMap<String, String> queryValues) 

    { 
     SQLiteDatabase database = this.getWritableDatabase(); 
     Log.d("home",database.toString()); 
     ContentValues values = new ContentValues(); 

     values.put("productId", queryValues.get("productId")); 
     values.put("category", queryValues.get("category")); 
     values.put("subcategory", queryValues.get("subcategory")); 
     values.put("mountingstyle", queryValues.get("mountingstyle")); 
     values.put("products", queryValues.get("products")); 
     values.put("description", queryValues.get("description")); 
     database.insert("guide", null, values); 
     database.close(); 
     Log.d("home","inserted"); 
    } 

    public ArrayList<String> getAllUsers() 
    { 
    ArrayList<String> usersList; 
    usersList = new ArrayList<String>(); 
    String selectQuery = "SELECT category,subcategory FROM guide"; 
    SQLiteDatabase database = this.getWritableDatabase(); 
    Cursor cursor = database.rawQuery(selectQuery, null); 
    Log.d("home", cursor.toString()); 
    if (cursor.moveToFirst()) { 
     do {               
      usersList.add(cursor.getString(0)); 


     }while (cursor.moveToNext()); 
    } 
    database.close(); 
    return usersList; 
} 


public ArrayList<HashMap<String, String>> getUsers() { 
    ArrayList<HashMap<String, String>> usersList; 
    usersList = new ArrayList<HashMap<String, String>>(); 
    String selectQuery = "SELECT category,subcategory FROM guide"; 
    SQLiteDatabase database = this.getWritableDatabase(); 
    Cursor cursor = database.rawQuery(selectQuery, null); 
    if (cursor.moveToFirst()) { 
     do { 
      HashMap<String, String> map = new HashMap<String, String>();    
      map.put(cursor.getString(0), cursor.getString(1)); 
      usersList.add(map); 

     } while (cursor.moveToNext()); 
    } 
    database.close(); 
    return usersList; 
} 

} 

Как я достичь this.Please помощь exaplanation

+1

Существует * слишком много * код здесь. Выясните, где в коде ваша проблема лежит, а затем только покажите нам это. –

+0

Я использую локальный хост для приложения, но хочу сделать его доступным для нескольких пользователей через разные сети. Я использовал здесь xampp. Как это можно сделать? – vtx

+0

Кажется, есть еще одна проблема: вы создаете список пользователей из категории и подкатегории? Вы хотите сохранить загруженные вами продукты? Работа с идентификаторами может сделать все проще. Вам нужно создать вторую таблицу, потому что каждый пользователь может иметь несколько продуктов, так что у вас есть продукт с продуктами и один с продуктами (ids of the), которые пользователь имеет. – maraca

ответ

0

Вы можете разместить свой веб-службы и базы данных на различных бесплатный хостинг сайтов, как https://www.2freehosting.com и после того, как хостинг вы можете предоставить URL веб-службы в андроид. Затем вы можете получить доступ к базе данных и веб-сервису в любой сети, в которой вы находитесь.

Edit 1:

И для выдачи или эффективной синхронизации данных в приложении периодически проверять: https://developer.android.com/training/sync-adapters/index.html

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