我有一个由RecyclerView膨胀的列表,该列表是由SQLite数据库提取的。我使用一个onCheckedChanged来操作数据。
如果单击CheckBox,则调用setItem()方法。
private void setItem(int position, boolean checked) {
// update entries in sqLiteDatabase at click position
// set the database-cursor to current entry
cursor.moveToPosition(position);
// convert boolean to integer, because SQLite does not support boolean values
int iSelected = checked ? 1 : 0;
// create SQL-query-string
String SQLQuery = "" +
"UPDATE country " +
"SET selected=" + iSelected +
" WHERE id='" + cursor.getString(cursor.getColumnIndex("id")) + "'";
// execute the query
sqLiteDatabase.execSQL(SQLQuery);
// create SQL-answer-string
String SQLAnswer = cursor.getString(cursor.getColumnIndex("name")) +
"; Id=" + cursor.getString(cursor.getColumnIndex("id")) +
"; Selected=" + cursor.getString(cursor.getColumnIndex("selected"));
Toast.makeText(context, SQLQuery + "\n\n" + SQLAnswer, Toast.LENGTH_LONG).show();
}当我在CheckBox上单击它一次时,它显示:
SQLQuery =>“更新国家集selected=1 WHERE id=3” SQLAnswer =>“捷克人;id=3;selected=1”
当我点击它两次时:
SQLQuery =>“更新国家集selected=0 WHERE id=3” SQLAnswer =>“捷克人;id=3;selected=1”
...and这个改变。因此,查询在0和1之间切换(取决于CheckBox),但答案永远不会变成0。
当我关闭应用程序并重新启动它时,数据库条目做得很好,但它在运行时没有更新。
有人想过(PHP从来没有过这样的问题)吗?
发布于 2019-01-01 01:15:55
我找到了一个方法:
Cursor c = sqLiteDatabase.rawQuery("SELECT * FROM country WHERE id='" + cursor.getString(cursor.getColumnIndex("id")) + "'", null);
c.moveToFirst();
System.out.println(c.getString(c.getColumnIndex("selected")));谢谢你的评论和帮助。
我认为,“游标”是在MainAktivity中生成的,用于膨胀适配器,因此,从游标中获取适配器中的一行,将在创建适配器时检索状态,并且适配器以后不能修改。
我甚至无法理解这个用recyclerView或viewHolder构建的奇怪结构。它们会更改复选框,这些复选框由onClickListener提供,只有通过滚动才能实现,程序员必须纠正这些错误。他们真的很蠢。在我看来,列表应该被夸大,os (android)必须在内部优化它。
https://stackoverflow.com/questions/53992330
复制相似问题