从Java对象更新/合并SQLite数据库表

6
这里有一个简单的例子来描述这个问题:
假设从SQLiteDB读取一个表并将其存储在Java集合对象中。

数据库表--->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对象-->数据库表(这是问题...)


如何更新/合并对象表与数据库?

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

我认为如果表足够大,则没有意义写入所有记录,如果只有一些记录被修改。

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

  • 在第二个Java对象中读取DBtable,然后比较两者(使用某种合并算法),并将操作(ADD,DELETE,MODIFY)直接应用于DB。 (我会接受对该比较算法的建议)

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

  • 其他更好的方法

感谢阅读


你的意思是说idTable是每个表的ID吗?而Data是数据库中表的名称吗? - gmhk
@harigm 哦,不是这个意思,我把它重命名为idRecord了,这些都是非常简单的表格,谢谢。 - Hernán Eche
3个回答

1

在同一事务中有两个语句。(不幸的是,SQLite不支持ON DUPLICATE KEY UPDATE功能,但嘿,它是“Lite”:P)

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

您可能能够确定哪些被忽略了。我会尝试做两个预处理语句,我猜执行将返回false,如果触发了忽略子句。试试看。

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

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


SQLite支持INSERT OR REPLACE,这可能符合您所需的ON DUPLICATE KEY UPDATE行为。请参见此处:http://www.sqlite.org/lang_insert.html - seh
这里不太适用,因为他只想在数据!= hastTableDate 时更新,据我所知,INSERT OR REPLACE 不允许我进行检查(使用 insert、select 和 on dup key 组合可以在 mysql 中实现)。 - JustDanyul

0
您可以实现类似于Hibernate会话缓存的行为(简化后)。您的内存表示可以保留一个“脏”标志,指示哪些对象需要在数据库中更新,哪些对象需要删除。根据您用于分配ID的算法(应用程序中心与数据库中心),您可以通过特殊值(例如0)或通过将此信息保留在脏标志中来识别已添加的对象。
另一个潜在的增强功能是考虑缓存的急切(一次性读取所有记录)与惰性(按需读取记录)加载。

0

跟踪已修改的记录在类似ArrayList的数据结构中。然后,在更新数据库时,仅更新已修改的记录。

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


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