Sqlite android 停止处理更新、删除

问题描述 投票:0回答:1

我有一个带有列表视图和一个按钮的活动,我使用 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

android sqlite android-listview
1个回答
0
投票

该适配器不是 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
方法的正确值。

© www.soinside.com 2019 - 2024. All rights reserved.