我有一张桌子
private static final String SQL_CREATE_TABLE_TASKS = String.format("CREATE TABLE %s"
+" (%s INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT, %s INTEGER, %s INTEGER, %s INTEGER)",
DatabaseContract.TABLE_TASKS,
TaskColumns._ID,
TaskColumns.DESCRIPTION,
TaskColumns.IS_COMPLETE,
TaskColumns.IS_PRIORITY,
TaskColumns.DUE_DATE
);
此DB的主键为_ID
public static final String _ID = "_id";
现在,问题来了:我使用游标查询数据库。
例如,如果我想检索主键= 0的一行,我应该这样做:
String query = "SELECT " + DatabaseContract.TaskColumns.DESCRIPTION +
", " + DatabaseContract.TaskColumns.DUE_DATE +
", " + DatabaseContract.TaskColumns.IS_COMPLETE +
", " + DatabaseContract.TaskColumns.IS_PRIORITY +
" FROM " + DatabaseContract.TABLE_TASKS +
selection +
" ORDER BY " +
sortOrder +
";";
db.rawQuery(query, null);
使用
string = "SELECT description, due_date, is_complete, is_priority FROM tasks WHERE _id = '0' ORDER BY is_complete ASC, is_priority DESC, due_date ASC;"
它应该返回表中所需行处的游标
但是,正如你所猜到的,我得到了一个错误:
致命异常: main
进程: android.database.CursorIndexOutOfBoundsException:,PID: 4195请求的com.google.developer.taskmaker索引0,大小为0
如果我试图检索另一行,例如2,它会给出一个不同的行,比如随机行。
如果我尝试这样做:
cursor.getColumnIndex("_id");
为了获取主键行的索引,它将返回-1,这显然不存在于数据库中,-1表示sqlite上的空指针异常。
如果我正在访问
int colIndex = -1;
cursor.getInt(colIndex);
为了获取该行的主键,我得到了一个错误。
有了这个问题,我不能删除/更新/查询具有主键ID的特定行,我认为主键行在某种程度上是隐藏的,我必须对其进行unlock
。
我甚至可以使用db.update/insert/query/delete
,但不能工作,所以我切换到原始查询以更好地控制它。
我必须很快地解决这个问题,任何帮助都是非常感谢的。
谢谢。
编辑#1:
我想通了一件事:
在查询数据库时,我增加了ID,因此如果需要第一项,它将查询id=1而不是id=0。现在,我的游标没有问题。但是,当我尝试更新一个条目时,例如使用第二个条目id=2,什么也没有发生。条目#2存在并显示在回收器视图中。如果是1,它应该选中一个复选框。这是在数据库上执行的查询:
query = "UPDATE tasks SET is_complete = '1' WHERE _id = '2';";
db.rawQuery(query, null);
在update查询之后,is_complete仍然是0。
发布于 2018-07-01 06:05:14
_id
列是AUTOINCREMENT
。这意味着您曾经插入到表中的第一行将具有_id=1
。
在执行以下命令时:
"SELECT description, due_date, is_complete, is_priority FROM tasks WHERE _id = '0' ORDER BY is_complete ASC, is_priority DESC, due_date ASC;"
您将不会得到任何行,因为在您的表中没有包含_id=0
的行,并且永远不会有。
此外,可能在ids之间存在差距,因为如果您使用_id=3
删除行,则再也不会有使用_id=3
的行。
也许您在recyclerview适配器中使用了_id
列中的值,这会把事情搞乱,因为项目在适配器中的位置与它的_id
无关。
https://stackoverflow.com/questions/44907846
复制相似问题