ActiveAndroid:如何为更新锁定记录?

3
在ActiveRecord中,有一个锁定记录的概念,用于更新以确保过时的对象不会保存到数据库中。
在ActiveAndroid中是否有相应的功能?如果有,是否有链接显示如何执行此操作?如果没有,那么防止过时对象保存到数据库的最佳方法是什么?

你的意思是不保存重复的内容吗? - user2511882
不完全正确。假设您查询一个对象,A = Foo(1),然后查询B = Foo(1)。现在,您有两个对象(A和B)代表id = 1的记录。现在,如果您修改A并保存,则B将变得陈旧,因为它没有A所做的最新更改。 - WindsurferOak
2个回答

0

我不知道答案,但我正在做的是,在我的模型类中声明一个唯一字段,并在唯一冲突时用新记录替换旧记录。

    @Column(name = "userId", notNull = true,unique = true,onUniqueConflict = Column.ConflictAction.REPLACE)
    private String userId;

0
ActiveAndroid有一个概念叫做beginTransaction() 和 endTransaction(),基本上类似于activeRecord中的locking record概念。使用beginTransaction()可以确保在访问方法或数据时进行任何更改时,没有其他对象会干扰该过程。一旦执行了endTransaction(),该方法就被“解锁”,其他对象就可以开始与它交互。

事务有不同的用途。通常使用事务来批量更新/插入/删除,以便全部成功或全部失败。它还可以提高这些操作的性能。但它不能防止更新过时对象。 - WindsurferOak
请原谅我如果我在这里说错了,因为我自己正在学习使用ActiveAndroid,但据我所知,ActiveAndroid映射到SQLite,而SQLite本身会在读取、写入等操作时锁定数据库... - user2511882
是的,没错;但据我所知,你仍然可以使用过期数据进行更新。 - WindsurferOak
在ActiveAndroid上吗?不是。我已经尝试过了。而且它不允许您在数据处于inProgress状态时访问它。因此,其他对象必须等待。 - user2511882
我明白你的意思。让我解释得更详细一些。假设你有A = Foo(1)和B = Foo(1)。修改A并在事务中保存A。现在,在事务结束后,评估B。B是否具有对A进行的更新?当你保存B时会发生什么?保存B会覆盖A所做的更改吗?这里的重点不是并发访问数据库。我了解数据库锁定的作用,这里的重点是B具有旧记录的副本。在ActiveRecord中,根据选择的策略,当你保存B时会出现错误,因为B保存了过期的数据。 - WindsurferOak
也许这条评论有点晚了,但如果你找到了什么,请更新答案。截至今天,我还没有得到任何具体的细节。 - user2511882

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接