这是一个描述问题的最小例子:
假设从SQLiteDB读取表并将其存储在Java Collection对象
中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个被添加)
如何使用DB更新/合并对象表?
为什么我要合并而不是简单地将对象保存到表?
我认为,如果表格足够大,那么在写入所有记录时没有任何意义,只要其中一些记录被修改。
删除整个DBtable并在(危险的同时)循环中,遍历对象以编写新表。
在第二个java obj中读取DBtable,然后比较两者(使用某种合并alghoritm)并将操作(ADD,DELETE,MODIFY)直接应用于DB。 (我会接受那种比较算法的推荐)
编辑: 首先不要创建集合,直接从DB读取和写入,始终通过JDBC传递查询
其他更好的方法
Thanks4Reading
答案 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)添加的对象,或者将此信息保留在脏标志中。
另一个潜在的增强功能是考虑急切(一次读取所有记录)与懒惰(根据需要读取记录)加载缓存。