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)
这是正确的方法吗?还是有更好的方法?
答案 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的形式为:-
这是我从中删除“ 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黑客。
再次,这不是正确的方法。但是只是发布我发现的有效解决方案。