我有一个带有列表视图和一个按钮的活动,我使用 sqlite 作为数据库
private SQLiteDatabase db;
db = getBaseContext().openOrCreateDatabase("app.db", MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS tasx (id INTEGER primary key autoincrement, name TEXT, complOn INTEGER, steps INTEGER)");
按钮将项目添加到列表
public void onClick(DialogInterface dialog,int id) {
String a = ("'");
Log.d("message",inputName.getText().toString() + inpuSteps.getText());
db.execSQL("INSERT OR IGNORE INTO tasx VALUES (NULL, " + a + inputName.getText().toString() +a +", "+a +inpuSteps.getText() +a+", "+a+ inputCompleted.getText()+a+");");
updateDB();
}
以及 UpdateDB 方法,它只是更新显示的列表
private void updateDB(){
ArrayList<DataModel> list = new ArrayList<>();
Cursor query = db.rawQuery("SELECT * FROM tasx;", null);
CustomAdapter adapter = new CustomAdapter(list, getApplicationContext());
while(query.moveToNext()){
String name = query.getString(1);
String age = String.valueOf(query.getInt(2));
String stp = String.valueOf(query.getInt(3));
list.add(new DataModel(name, age + "/"+stp));
}
lv.setAdapter(adapter);
// query.close();
}
我遇到的最后一件事是单击列表项
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ImageView photo = (ImageView) view.findViewById(R.id.plus);
onCompliteTask((int) id);
photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}});
private void onCompliteTask(Integer i){
Runnable runnable = () -> {
db.execSQL("UPDATE tasx SET complOn = complOn + 1 WHERE id = "+ i);
Log.d("click","successuful" + i);
};
Runnable runnable1 = () -> {
db.execSQL("DELETE FROM tasx WHERE id = "+i+" AND complOn >= steps");
Log.d("click","successuful" + i);
};
Thread thread = new Thread(runnable);
Thread thread1 = new Thread(runnable1);
thread.start();
thread1.start();
// updateDB();
}
此外,当我只是检查功能和性能时,它起作用了,但由于某种我不知道的原因它停止了。我认为sqlite不支持同时多个查询,并首先将其移至单独的类,然后移至单独的线程,但这并没有帮助。显示日志,但不执行请求。我会很高兴获得任何帮助或提示,这是我第一次使用 sqlite
该适配器不是 Cursor Adapter(它不能是,因为 CursorAdapter 需要列名_id)。
因此,
long id
不会是行的id,它将是列表/数组中显示行的位置,0作为第一个项目,1作为下一个项目,依此类推。该位置很少会等于底层行的 id。
因此,您需要从该位置的对象获取 id(位置或 id,它们实际上具有相同的值,但 id 是一个 long)或使用 CursorAdapter(需要类似
SELECT *,id AS _id ....
或可能 SELECT rowid AS _id,* ....
)这样 int (实际上应该很长)是传递给 onCompliteTask
方法的正确值。