When starting the application, I first need to synchronize the data in the database so that users can view the data offline. Therefore, I created a special class for synchronization, where the data from the web is compared and, if necessary, written to the local SQLite database.
The problem occurs when retrieving data from the SQLite database to compare changes with data from the Internet.
I tried using AsyncTask, which I normally use in other classes, but that caused the application to restart over and over again.
When using "public class GetDbData implements Runnable {...}" the errors below occur and it is not clear to me what is causing them.
Thank you for your responses.
Error messages:
2021-10-13 11:01:36.682 18498-18590/com.commonsware.android E/AndroidRuntime: FATAL EXCEPTION: Thread-10
Process: com.commonsware.android, PID: 18498
java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.
at androidx.room.RoomOpenHelper.checkIdentity(RoomOpenHelper.java:136)
at androidx.room.RoomOpenHelper.onOpen(RoomOpenHelper.java:116)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onOpen(FrameworkSQLiteOpenHelper.java:151)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:409)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:298)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:96)
at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
at androidx.room.RoomDatabase.query(RoomDatabase.java:238)
at com.commonsware.android.database.DbDao_Impl.getAllNews(DbDao_Impl.java:190)
at com.commonsware.android.synchronize_data.SyncNews$GetDbData.run(SyncNews.java:178)
at java.lang.Thread.run(Thread.java:764)
2021-10-13 11:01:36.869 18498-18498/com.commonsware.android E/WindowManager: android.view.WindowLeaked: Activity com.commonsware.android.SyncActivity has leaked window DecorView@30e5ecf[SyncActivity] that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:529)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:329)
at com.commonsware.android.SyncActivity.onCreate(SyncActivity.java:24)
at android.app.Activity.performCreate(Activity.java:7148)
at android.app.Activity.performCreate(Activity.java:7139)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2924)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3079)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1836)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6702)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)
My Class:
public class SyncNews {
private Context context;
private DbRoomDatabase db;
private DbDao dbDao;
private String JSON_URL_NEWS = "URL for data";
private Boolean webDataError = false;
private JSONObject webData;
private List<News> newsDB = null;
private List<News> newsListAdd = new ArrayList<>();
private List insertData;
public SyncNews(Context ct) {
context = ct;
db = DbRoomDatabase.getDatabase(context);
dbDao = db.dbDao();
GetWebData getWebData = new GetWebData();
Thread getWebDataThread = new Thread(getWebData);
getWebDataThread.start();
while(webDataError == false && getWebDataThread.isAlive()) {};
if(webDataError == false) {
GetDbData getDbData = new GetDbData();
Thread getDbDataThread = new Thread(getDbData);
getDbDataThread.start();
while(getDbDataThread.isAlive()) {}
Log.d("TEST", String.valueOf(newsDB));
}
}
public void syncWithDb() {
//synchronize
}
public void InsertData () {
if (insertData.size() > 0)
dbDao.insertMultipleNews(insertData);
}
public class GetWebData implements Runnable {
@Override
public void run() {
if(!this.getWebData()) {
Looper.prepare();
webDataError = true;
Toast.makeText(context, context.getString(R.string.mess_data_has_not_been_synchronized), Toast.LENGTH_LONG).show();
Looper.loop();
}
}
public Boolean getWebData() {
RequestQueue requestQueue = Volley.newRequestQueue(context);
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, JSON_URL_NEWS, new JSONObject(), future, future);
requestQueue.add(request);
try {
webData = future.get();
Log.e("getWebData", String.valueOf(request));
} catch (InterruptedException | ExecutionException e) {
if (VolleyError.class.isAssignableFrom(e.getCause().getClass())) {
VolleyError ve = (VolleyError) e.getCause();
Log.i("getWebData", String.valueOf(ve));
if (ve.networkResponse != null) {
Log.i("getWebData", String.valueOf(ve.networkResponse));
Log.i("getWebData", String.valueOf(ve.networkResponse.statusCode));
Log.i("getWebData", String.valueOf(ve.networkResponse.data));
}
}
return false;
}
return true;
}
}
public class GetDbData implements Runnable {
@Override
public void run() {
newsDB = dbDao.getAllNews();
}
}
}
Every time the schema/entity class of your DB altered, you may need to upgrade your DB version
In this case, seems you need to upgrade your DB version, you can find in
@Database(version = xx)in your Database class