首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法使用主键查询SQLite安卓数据库

无法使用主键查询SQLite安卓数据库
EN

Stack Overflow用户
提问于 2017-07-04 21:53:57
回答 1查看 648关注 0票数 0

我有一张桌子

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。

EN

回答 1

Stack Overflow用户

发布于 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无关。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44907846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档