我在Android上开发和维护Google Tasks应用。目前,我有一个类,该类按顺序包含列表和任务ArrayList
。我正在考虑切换到SQLite,以更好地构建应用程序。我不确定将任务的顺序存储在数据库中的最佳和最简单的方法是什么。
现在,我可以简单地remove
和add
在不同的指数的项目,显然其他列表行索引在正确的顺序。使用SQLite数据库,我可以在每行中存储一个位置编号,并且每当我移动任务时,都相应地更新以下几行。
该系统的问题是并发性和可维护性:如果同时更新某行的位置(并且随后各行的位置增加/减少),则同步任务时可能会发生混乱,因为同步也更改了行位置。
我可以添加Mutex锁,但我不想这样做,我希望用户能够在同步的同时更新数据,如果发生冲突,则将丢弃新位置之一,而不会接下来的行被弄乱了。
我的问题:在SQLite数据库中存储和更新订单的最佳方法是什么?
sort_position
向每行添加一个值的问题在于它不能自动更新,因为要交换列表中的两个项目,您需要同时更改两个位置。当对同一行进行更改时,数据库在保证原子性方面要好得多。
更好的方法是将排序列作为优先级-值可以稀疏,因此可以在两个相邻的列之间放置一行,并且两个项目可以具有相同的值,而不会带来一致性问题。如果值稀疏,则可以通过仅更改一个值来交换两个项目,因此可以更优雅地处理并发更新(尽管如果两个代理尝试重新排列列表的同一部分,则可能会遇到意外情况)。
另一种处理方式可能是将订单作为一个值存储在不同的表中,例如作为项目ID列表存储。这样做的好处是可以更精确地控制排序,而不会因交错更新而出现乱码状态,但是更为复杂(处理丢失或未知的项目,如何同时处理两个更新)。除非您真的需要,否则我不会尝试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句