Приложения зависают при обновлении данных в SQLite
Я могу вставить данные в SQLite
а затем заселить мой ListView
с данными.
Но всякий раз, когда я пытаюсь обновить данные, мой телефон зависает, и мне нужно снова открыть приложение, чтобы продолжить
Это также происходит на других устройствах, что означает, что в моем коде есть что-то, что вызывает зависание
Мои коды Java для обновления данных
boolean editContent(){
SQLiteDatabase db = myDb.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(myDb.COL_NAME, savedName.getText().toString());
contentValues.put(myDb.COL_IP, savedIP.getText().toString());
contentValues.put(myDb.COL_PORT, savedPort.getText().toString());
contentValues.put(myDb.COL_USER_ID, savedUserID.getText().toString());
contentValues.put(myDb.COL_USER_PASS, savedUserPass.getText().toString());
//db.update(myDb.TABLE_NAME, contentValues , "ID=" + thisID, null); // problem
db.update(myDb.TABLE_NAME, contentValues , "ID = '"+ thisID +"'", null);// solution
if (editContent() == true){
Toast.makeText(editActivity.this, "Edit Done!", Toast.LENGTH_SHORT).show();
return true;
}else{
Toast.makeText(editActivity.this, "Edit failed!", Toast.LENGTH_SHORT).show();
return false;
}
}
Только LogCat я получаю, если я немного подожду
09-09 16:42:14.896 8903-8918/app.my.my W/art: Suspending all threads took: 29.860ms
09-09 16:42:14.922 8903-8924/app.my.my I/art: Background sticky concurrent mark sweep GC freed 23583(1062KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 125MB/127MB, paused 21.123ms total 75.895ms
09-09 16:42:17.671 8903-8924/app.my.my I/art: Background sticky concurrent mark sweep GC freed 13051(586KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 126MB/127MB, paused 19.706ms total 84.816ms
09-09 16:42:19.058 8903-8924/app.my.my I/art: Background sticky concurrent mark sweep GC freed 7133(319KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 126MB/127MB, paused 19.733ms total 71.671ms
09-09 16:42:20.202 8903-8924/app.my.my I/art: Background sticky concurrent mark sweep GC freed 3855(171KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 126MB/127MB, paused 20.306ms total 70.792ms
09-09 16:42:20.668 8903-8924/app.my.my I/art: Background partial concurrent mark sweep GC freed 4903(287KB) AllocSpace objects, 3(37MB) LOS objects, 4% free, 88MB/92MB, paused 20.672ms total 133.448ms
09-09 16:42:31.064 8903-8924/app.my.my I/art: Background sticky concurrent mark sweep GC freed 48833(2MB) AllocSpace objects, 0(0B) LOS objects, 2% free, 90MB/92MB, paused 25.972ms total 112.428ms
09-09 16:42:36.098 8903-8924/app.my.my I/art: Background partial concurrent mark sweep GC freed 23981(1084KB) AllocSpace objects, 0(0B) LOS objects, 4% free, 91MB/95MB, paused 28.538ms total 150.916ms
09-09 16:42:36.098 8903-8923/app.my.my I/art: WaitForGcToComplete blocked for 34.288ms for cause HeapTrim
2 ответа
Я не знаю почему, но большую часть времени я находил решение своей проблемы после того, как отправил вопрос на SO
проблема была здесь
db.update(myDb.TABLE_NAME, contentValues , "ID = '"+ thisID +"'", null);// solution
if (editContent() == true){
Toast.makeText(editActivity.this, "Edit Done!", Toast.LENGTH_SHORT).show();
return true;
}else{
Toast.makeText(editActivity.this, "Edit failed!", Toast.LENGTH_SHORT).show();
return false;
}
который мне удалось решить, сделав это
int isUpdated = db.update(myDb.TABLE_NAME, contentValues , "ID = '"+ thisID +"'", null);// solution
if (isUpdated > 0){
Toast.makeText(editActivity.this, "Edit Done!", Toast.LENGTH_SHORT).show();
return true;
}else{
Toast.makeText(editActivity.this, "Edit failed!", Toast.LENGTH_SHORT).show();
return false;
}
кажется editContent
boolean
была причина для замораживания
Кажется, вы создаете бесконечный цикл. т.е. editContent()
будет продолжать звонить editContent()
и, следовательно, никогда не выходя из функции. И да, как вы решили это правильный путь.