SQLite(Android):使用ORDER BY更新查询

时间:2019-02-18 12:19:35

标签: android sql database sqlite

Android,SQLite:我想在Android中使用SQLite 在myTable的其他行之间插入行。为此,我尝试增加从第3行开始的所有行的ID,以便可以在位置3插入新行。

myTable的主键是列ID。表格中没有其他限制。

我尝试使用https://stackoverflow.com/a/9177264/6671004中提到的查询。此查询可以 mySQL中工作,但不能在Android(SQLite)

中工作

这是代码行:

database.execSQL("UPDATE myTable SET id = (id + 1) where id > 2 ORDER BY id desc");

这是我在Android Studio上遇到的错误(编译时): https://imgur.com/a/9r0iyAa

这是我从查询中删除“ ORDER BY id DESC”时遇到的异常:

  

java.lang.RuntimeException:无法启动活动ComponentInfo {...}:android.database.sqlite.SQLiteConstraintException:UNIQUE约束失败:myTable.id(代码1555)

这是正确的方法吗?还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

  

我尝试使用中提到的查询   https://stackoverflow.com/a/9177264/6671004。此查询确实适用   mySQL,但不在Android(SQLite)中

该问题被标记为MYSQL。 MYSQL与SQLite有许多差异。

  

这是代码行:

     

database.execSQL("UPDATE myTable SET id = (id + 1) where id > 2 ORDER BY id desc");

SQLite UPDATE SQL的形式为:-

enter image description here

  • 即没有ORDER BY子句,因此错误提示,如果您要使用任何关键字,则必须为BETWEEN或IN或; (当然,您也可以使用AND扩展条件OR等)。
  

这是我从中删除“ ORDER BY id DESC”时遇到的异常   查询:

原因是 rowid (id是 rowid 的别名)具有隐式UNIQUE约束,并且行将根据 id 列。因此,如果有多于3行(或者已经被删除并且最后一行从未被删除),那么当id为3时,将存在具有4的行并且3 + 1 = 4,因此该行已经存在,因此存在UNIQUE约束

  

我想使用SQLite在myTable的其他行之间插入行   安卓为此,我正在尝试增加所有行的ID   开始说第3行。这样我就可以在位置3插入新行。

简而言之,这不是一个好主意,实际上绝对不需要。

  

这是正确的方法吗?还是有更好的方法?

绝对

猜想您想要一个很好的人类可以理解的值,以便您了解正在发生的事情。例如,您可能会显示一个带有序列的列表,因此您可以说删除序列号为3的行,从而将其等同于id列。很好,直到您以不同的顺序显示列表,这可能更便于用户使用。突然,您的序列变得复杂甚至无用,并且显示混乱。

id 指示符用于标识行并允许快速访问该行,因为数字索引的处理效率(比人类易于理解的非数字索引)更高。它们还可以减少不必要的额外处理(转移数据)。

一种有效的方法是通过将 id 绑定到列表中的位置来显示列表(因此position可以是保存相应ID的数组的第n个元素,从而重新生成列表(底层数组)按照不同的顺序排列,因此第n个元素仍将具有相应的ID)。

在移动行的过程中遇到麻烦将带来额外的资源使用,例如额外的磁盘IO,其成本相对昂贵。事实是,您将不得不以相反的顺序处理行以绕过UNIQUE约束,这将使情况更加复杂,因为SQLite默认情况下会尝试高效地执行更新,而不是迎合需求,因此它本身将需要使用甚至更昂贵的方法。偏离了利用基本效率的公认/公认技术所需的效率。

答案 1 :(得分:1)

许多人指出,这绝对不是正确的方法。

但是我发现了解决方法,以防其他人正在寻找类似的实现。

是这里:

UPDATE myTable SET id = - (id + 1) WHERE id > 1;
UPDATE myTable SET id = - id WHERE id < 0;

这是我发现的here黑客。

再次,这不是正确的方法。但是只是发布我发现的有效解决方案。