【问题标题】:Update records in database from an object list repeatedly重复从对象列表更新数据库中的记录
【发布时间】:2013-09-22 09:35:31
【问题描述】:

我有一个包含这些对象的列表:

public class Foo {
    public String title;
    public String subject;
}

例如:List<Foo> mFoo = new ArrayList<Foo>();

我的数据库中有一个具有相同名称和相同属性的表。

此列表包含大约 1000 个对象。第一次处理此列表时,所有对象都将存储在数据库中。

下一次,List 中的一些对象会发生变化,或者一些新的对象也会添加它。这就是问题所在。

如何更新新对象并将其添加到数据库以避免将数据库中存储的所有对象加载到其他列表中,然后比较两个列表?

是否存在某种方式可以最大限度地减少对数据库的访问? (我不想每次加载 1000 个对象)

编辑 1:扩展信息

我从解析外部源数据(html 代码)的方法中获得List<Foo> mFoo。然后我将对象作为 Foo 保存在数据库中。

当我保存一个对象时,我得到一个 id;

public class Foo {
    private String id; 
    public String title;
    public String subject;
}

每次执行该方法时,我都会得到一个列表,其中可能包含数据库中已经存在的对象 Foo,但我没有它的 id,因为它们是新实例。

【问题讨论】:

  • 所以,为了澄清,数据库和列表会改变(不同步)?
  • 没有。当列表将更改(对象更改或添加新对象)时,数据库必须保存列表中的更改。但是每次添加对象或更改对象时,我都无法更新数据库。我有完整的列表,我必须与数据库中的记录进行比较。 (作为合并操作)
  • 那么提供的答案是可以的。虽然我可能会建议有第二个列表,但当某些内容发生更改/添加时,您将其放在第二个列表中......然后您只需将第二个列表加载到数据库中。这对你的情况有用吗?
  • 我添加了一些额外的信息。可惜我不能用它
  • 那么我怀疑你注定需要将它们全部比较......也许你可以考虑进行一些重新设计以使其不是这样?我的意思是,这样你就可以保留 ID,或者当方法运行时你不会丢失你已经拥有的一切?

标签: java android sql sqlite android-sqlite


【解决方案1】:

我建议使用一些标志来将实例标记为脏:

public class Foo {
  private String title;
  private String subject;
  private boolean isDirty=true;


  public void onPersist(){
    this.isDirty=false;
  }

  public String setTitle(String title){
    this.isDirty=true;
    this.title=title;
  }

  //more setters und getters

}

编辑 1

正如 d'alar'cop 指出的,您似乎别无选择,只能根据标题和/或主题查询数据库。

但是根据您的标签,您使用的是 sqlite。如果您可以控制 tabledefinition,则可以查看 ON CONFLICT [REPLACE|IGNORE] 子句在 create 语句中具有唯一约束。这样,您应该能够插入您的列表并让 do 数据库工作。

最好的问候, 山姆

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2016-10-02
    相关资源
    最近更新 更多