I am using python script running for some calculations and saving the results to SQLite database. Python operation takes time to process, so i put that part in an asyncTask. And database insertion is written inside the onPostExecute() method. Data inserion is happening and returning the row id as well. These datas displayed on another activity, while i am trying to open that record screen app crashes and that db data row also warnished from db. I tried this by removing that python part and it's working fine. I can see the record list as well.
see below complete error log
2020-11-25 21:03:35.602 3997-3997/com.ust.step_count_directions E/SQLiteLog: (522) statement aborts at 2: [select * from GaitStatisticsDatas WHERE Category = 0] disk I/O error - SQLITE_IOERR_SHORT_READ
2020-11-25 21:03:35.602 3997-3997/com.ust.step_count_directions E/SQLiteQuery: exception: disk I/O error - SQLITE_IOERR_SHORT_READ (Sqlite code 522 SQLITE_IOERR_SHORT_READ), (OS error - 11:Try again); query: select * from GaitStatisticsDatas WHERE Category = 0
2020-11-25 21:03:35.603 3997-3997/com.ust.step_count_directions D/AndroidRuntime: Shutting down VM
2020-11-25 21:03:35.607 3997-3997/com.ust.step_count_directions E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ust.step_count_directions, PID: 3997
android.database.sqlite.SQLiteDiskIOException: disk I/O error - SQLITE_IOERR_SHORT_READ (Sqlite code 522 SQLITE_IOERR_SHORT_READ), (OS error - 11:Try again)
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:904)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:851)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:149)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:137)
at com.ust.step_count_directions.acitvities.ui.home.RecordList.onCreateView(RecordList.java:140)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
see my code
class BackgroundRunner extends AsyncTask<String,String,String>{
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(TestScreen.this, R.style.MyTheme);
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Large);
progressDialog.show();
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
PyObject pyObject1 = null;
Log.d("array_time..","array_time.."+mStartTestTime+" "+endTestTime);
if (!Python.isStarted()) {
Log.d("Py..", "Py..");
Python.start(new AndroidPlatform(mcontext));
Python py = Python.getInstance();
PyObject pyObject = py.getModule("app");
pyObject1 = pyObject.callAttr("score", mStartTestTime, endTestTime);
p_step_count = pyObject1.asList().get(0).toInt();
p_total_time = pyObject1.asList().get(1).toDouble();
p_stride_time = pyObject1.asList().get(2).toDouble();
p_stance_time = pyObject1.asList().get(3).toDouble();
p_swing_time = pyObject1.asList().get(4).toDouble();
p_cadence = pyObject1.asList().get(5).toDouble();
p_gait_score = pyObject1.asList().get(6).toDouble();
}
return "null";
}
@Override
protected void onPostExecute(String s) {
dbManager.insertStatistics2("s",helper.TABLE_STEP_STATISTICS,p_stride_time,p_cadence,
p_stance_time, p_swing_time,p_total_time,Category,p_step_count,p_gait_score);
progressDialog.dismiss();
mAlertDialogView = ViewUtils.showResultDialog(TestScreen.this, strideTime, stanceTime, swingTime, cadenceTime, totalSteps, totalTime, view -> {
if (mAlertDialogView != null) {
mAlertDialogView.dismiss();
resetTimer();
crpv.setPercent(0);
static_img.setVisibility(View.VISIBLE);
static_img.setImageResource(R.drawable.walk_static);
gifImageView.setVisibility(View.GONE);
test_t2.setText(discription);
test_t1.setText(heading);
}
});
}
}
And error is throwing on cursor.getCount() > 0 on below code which is another fragment.
helper = new DatabaseHelper(getContext());
dbManager = new DBManager(getContext());
dbManager.open();
Cursor cursor = dbManager.fetchNormal();
if (cursor.getCount() > 0) {
cursor.moveToFirst();
while (cursor.isAfterLast() == false) {
gait_cycle.add(cursor.getString(cursor.getColumnIndex(helper.COLUMN_CADENCE)));
stride_time.add(cursor.getString(cursor.getColumnIndex(helper.COLUMN_STRIDE_TIME)));
stance_time.add(cursor.getString(cursor.getColumnIndex(helper.COLUMN_STANCE_TIME)));
cursor.moveToNext();
}
}