我使用名为flagTable的表创建了一个数据库,该表只有两个字段,即id(自动增量)和整数字段。接下来,在我的程序中,我有一个触发线程启动的按钮。当线程启动时,它会不断地从数据库中检索数据,并检查值是否为值,如果该值等于1则会触发另一个新线程,如下所示:
private class statusOfStrummingInAnotherDevice extends Thread {
int value;
public void run() {
try{
while(true){
try{
if(flagCursor == null){
flagCursor = cdb1.getFlagAll();
}
}catch(Exception e){break;}
try{
Log.i("MAIN3ACTIVITY","getting status");
int size = cdb1.getSize(flagCursor);
Log.i("MAIN3ACTIVITY","SIZE is" + String.valueOf(xyz));
for(int i = 0 ; i < size ; i++){
flagCursor.moveToPosition(i);
Log.i("MAIN3ACTIVITY","getting status jkasdfasdf");
value = cdb1.getFlag();
if(value == 1){
Log.i("FLAGCURSOR=====>>>>","Succesful");
releasingNotes = new ReleasingNotes(IntendedChord);
releasingNotes.start();
//break;
}
cdb1.updateFlag(0);
Log.i("FLAGCURSOR=====>>>>",String.valueOf(value));
}
flagCursor = null;
}catch(Exception e){break;}
Log.i("MAIN3ACTIVITY","thread is sleeping");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
}catch(Exception e){
}
}
}
与此同时,从数据库中检索的数据正在使用此功能:
public Cursor getFlagAll(){
return getReadableDatabase().rawQuery(
"SELECT _ID, flag from flagTable", null);
}
并且,通过此方法更新到数据库的数据:
public int updateFlag(int i) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("flag",i);
return db.update("flagTable" , contentValues , "_ID" + "= ?",new String[]{String.valueOf(1)});
}
现在,上面的代码没有错误,但是,从数据库中检索的数据总是1,它会保持触发新功能。在上面的代码中,我说如果值等于1,那么当前线程将触发一个新线程启动,当它完成时,程序会将当前数据更新为0.这样,下一轮无限循环可以停止触发新线程,直到满足条件。什么是问题?我的代码真的更新了新值吗?或者我每次更新新值时都需要引用数据库。
答案 0 :(得分:0)
将监听器用于您的数据库。
使用SQLiteTransactionListener
并在onCommit()
有些指南详情如下: https://developer.android.com/reference/android/database/sqlite/SQLiteTransactionListener.html和