【问题标题】:Cannot query SQLite Android Database using primary key无法使用主键查询 SQLite Android 数据库
【发布时间】: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


【解决方案1】:

_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 的行,而且永远不会有。
id 之间也可能存在间隙,因为如果您删除带有 _id=3 的行,则永远不会再有带有 _id=3 的行。

也许您在 recyclerview 适配器中使用 _id 列中的值,这会使事情变得混乱,因为适配器中项目的位置与其 _id 无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多