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());
}
}
像你說的,但不工作我試圖關閉它。 – Avijit
(DBHelper.java:52)database.update(DBContact.TABLE_NAME,contentValues,selection,selection_args); (NetworkMonitor.java:48) dbHelper.updateDatabase(姓名,DBContact.sync_status_ok,數據庫); – Avijit
現在你得到什麼問題? – Pavan