从java对象更新/合并SQLite DB表

时间:2011-06-13 14:40:08

标签: java sqlite orm collections jdbc

这是一个描述问题的最小例子:

假设从SQLiteDB读取表并将其存储在Java Collection对象

数据库表---> Java对象


idRecord | Data   (table stored at DB)
1         One
2         Two
3         Three
4         Four

通过 sqlite jdbc 库:

Map objTable = new HashMap(); //...添加一些jdbc的东西,我们在objTable

中得到了DBTable的副本

然后,如果对象被修改,那么就是。

idRecord | Data   (modified table stored at objTable)    
2         Two
4         FourModified
5         Five

(ID 1和3被删除,2个保持不变,4个被修改,5个被添加)

Java对象 - >数据库表(这是问题......)


如何使用DB更新/合并对象表?

为什么我要合并而不是简单地将对象保存到表

我认为,如果表格足够大,那么在写入所有记录时没有任何意义,只要其中一些记录被修改。

  • 删除整个DBtable并在(危险的同时)循环中,遍历对象以编写新表。

  • 在第二个java obj中读取DBtable,然后比较两者(使用某种合并alghoritm)并将操作(ADD,DELETE,MODIFY)直接应用于DB。 (我会接受那种比较算法的推荐)

  • 编辑: 首先不要创建集合,直接从DB读取和写入,始终通过JDBC传递查询

  • 其他更好的方法

Thanks4Reading

3 个答案:

答案 0 :(得分:1)

同一交易中的两个陈述。 (遗憾的是,SQLite不支持ON DUPLICATE KEY UPDATE ish功能,但是嘿,它是“Lite”:P)

首先,INSERT或IGNORE 然后 UPDATE yourtable SET data = hashTableData WHERE id = hashTableId AND data!= hashTableData

您可能能够识别哪些被忽略。我会尝试做两个预备语句,我猜如果忽略子句被触发,执行将返回false。试试吧。

如果是这种情况,那么在false上进行更新。

否则,为每个语句循环两次数据并在完成后提交转换:)

答案 1 :(得分:0)

跟踪在类似的ArrayList中修改过的记录。然后,当更新数据库时,只更新已修改的记录。

您可以创建一个执行上述操作的基类,然后为模式中的每个表扩展它。

答案 2 :(得分:0)

您可以实现类似于Hibernate会话缓存的(简化)行为的行为。您的内存表示可以保留一个“脏”标志,指示需要在数据库中更新哪些对象以及删除哪些对象。根据您用于分配ID的算法(以应用程序为中心与以数据库为中心),您可以识别由特殊值(例如0)添加的对象,或者将此信息保留在脏标志中。

另一个潜在的增强功能是考虑急切(一次读取所有记录)与懒惰(根据需要读取记录)加载缓存。