2017-05-28 33 views
0

我工作的一個Android應用程序,我需要同步我的本地SQLite數據庫MySQL數據庫提供互聯網上的網絡連接的Android SQLite數據庫同步顯示錯誤。 第1步:當應用程序與互聯網連接運行時,數據將被髮送到真實服務器。 第2步:當應用程序運行沒有互聯網連接,數據將被存儲在本地sqlite數據庫。當應用程序獲取互聯網時,存儲的數據將被同步到真實的服務器數據庫。在可用

在我的應用程序,步驟1是工作fine.But當數據試圖被同步,應用程序是被壓碎。

我提供我下面的錯誤日誌和類。

[ERROR] FATAL EXCEPTION: main Process: com.w3xplorers.syncdb, PID: 3357 
                   java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.w3xplorers.syncdb/databases/sqlite_db 
                    at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 
                    at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1545) 
                    at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1522) 
                    at com.w3xplorers.syncdb.DBHelper.updateDatabase(DBHelper.java:52) 
                    at com.w3xplorers.syncdb.NetworkMonitor$1.onResponse(NetworkMonitor.java:48) 
                    at com.w3xplorers.syncdb.NetworkMonitor$1.onResponse(NetworkMonitor.java:41) 
                    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 
                    at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 
                    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
                    at android.os.Handler.handleCallback(Handler.java:739) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:135) 
                    at android.app.ActivityThread.main(ActivityThread.java:5254) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Dbhelper類:

public class DBHelper extends SQLiteOpenHelper { 
private static final int DATABASE_VERSION = 1; 
private static final String CREATE_TABLE = "create table " + DBContact.TABLE_NAME+ 
     " (id integer primary key autoincrement,"+DBContact.NAME+" text,"+DBContact.STATUS+" integer);"; 
private static final String DROP_TABLE = "drop table if exists "+DBContact.TABLE_NAME; 

public DBHelper(Context context) { 
    super(context, DBContact.DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL(DROP_TABLE); 
    onCreate(db); 
} 

public void saveToLocalDatabase(String name,int sync_status,SQLiteDatabase database){ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DBContact.NAME,name); 
    contentValues.put(DBContact.STATUS,sync_status); 
    database.insert(DBContact.TABLE_NAME,null,contentValues); 

} 

public Cursor readFromLocalDb(SQLiteDatabase database){ 
    String[] projections = {DBContact.NAME,DBContact.STATUS}; 
    return (database.query(DBContact.TABLE_NAME,projections,null,null,null,null,null)); 
} 

public void updateDatabase(String name,int sync_status,SQLiteDatabase database){ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DBContact.STATUS,sync_status); 
    String selection = DBContact.NAME+" Like ?"; 
    String[] selection_args = {name}; 
    database.update(DBContact.TABLE_NAME,contentValues,selection,selection_args); 
} 
} 

NetworkMonitor.java

public class NetworkMonitor extends BroadcastReceiver { 
@Override 
public void onReceive(final Context context, Intent intent) { 
    if(checkNetworkConnection(context)){ 
     final DBHelper dbHelper = new DBHelper(context); 
     final SQLiteDatabase database = dbHelper.getWritableDatabase(); 
     Cursor cursor = dbHelper.readFromLocalDb(database); 

     while (cursor.moveToNext()){ 

      int sync_status = cursor.getInt(cursor.getColumnIndex(DBContact.STATUS)); 
      if(sync_status==DBContact.sync_status_failed){ 
       final String name = cursor.getString(cursor.getColumnIndex(DBContact.NAME)); 
       StringRequest stringRequest= new StringRequest(Request.Method.POST, DBContact.SERVER_URL, 
         new Response.Listener<String>() { 
          @Override 
          public void onResponse(String s) { 
           try { 
            JSONObject jsonObject = new JSONObject(s); 
            String Response = jsonObject.getString("response"); 
            if(Response.equals("OK")){ 
             dbHelper.updateDatabase(name,DBContact.sync_status_ok,database); 
             context.sendBroadcast(new Intent(DBContact.UI_UPDATE_BROADCAST)); 
            } 
           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 

          } 
         }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError volleyError) { 

        } 
       }) 
       { 
        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 
         Map<String ,String> params = new HashMap<>(); 
         params.put("name",name); 
         return params; 
        } 
       }; 

       MySingleton.getInstance(context).addToRequestQueue(stringRequest); 
      } 
     } 

     dbHelper.close(); 
    } 
} 

public boolean checkNetworkConnection(Context context){ 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
    return (networkInfo!=null && networkInfo.isConnected()); 
} 
} 

回答

0

我認爲問題出在你的NetworkMonitor的onReceive結束語句 你關閉數據庫

dbHelper.close(); 

onResponseü訪問相同dbHelper,所以你必須刪除dbHelper.close();onResponse

更好ü創建SQLiteDatabase在DBHelper類函數例如其中u想用它來避免此類問題

+0

像你說的,但不工作我試圖關閉它。 – Avijit

+0

(DBHelper.java:52)database.update(DBContact.TABLE_NAME,contentValues,selection,selection_args); (NetworkMonitor.java:48) dbHelper.updateDatabase(姓名,DBContact.sync_status_ok,數據庫); – Avijit

+0

現在你得到什麼問題? – Pavan