【发布时间】:2018-07-01 07:18:37
【问题描述】:
我有这张桌子
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
);
这个数据库的主键是_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;"
它应该在表格中需要的行返回一个游标
但是,你可以猜到,我收到了一个错误:
致命异常:主要
进程:com.google.developer.taskmaker,PID:4195 android.database.CursorIndexOutOfBoundsException:请求索引 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 存在并显示在recyclerview 中。如果它是 1,它应该检查一个复选框。这是在数据库上执行的查询:
query = "UPDATE tasks SET is_complete = '1' WHERE _id = '2';";
db.rawQuery(query, null);
更新查询后,is_complete 仍为 0。
【问题讨论】:
-
您没有共享足够的代码来解决问题
-
你想看什么代码?没有什么可以帮助您更深入地了解问题...
-
显然所选列中没有 ID
-
你的光标似乎是空的,没有你正在寻找的列
-
我在帖子中添加了一个编辑。
标签: android sql sqlite cursor primary-key