Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java对象更新/合并SQLite DB表_Java_Sqlite_Orm_Collections_Jdbc - Fatal编程技术网

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

从java对象更新/合并SQLite DB表,java,sqlite,orm,collections,jdbc,Java,Sqlite,Orm,Collections,Jdbc,这里有一个简单的例子来描述这个问题: 假设从SQLiteDB读取一个表并将其存储在Java集合对象中 DB表-->Java对象 并通过sqlite jdbc库: Map objTable=newhashmap();/。。。通过添加一些jdbc内容,我们可以在objTable中获得DBTable的副本 然后,如果修改了对象,则被删除 idRecord | Data (modified table stored at objTable) 2 Two 4

这里有一个简单的例子来描述这个问题:

假设从SQLiteDB读取一个表并将其存储在Java集合对象中

DB表-->Java对象
并通过sqlite jdbc库:

Map objTable=newhashmap();/。。。通过添加一些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,然后比较两者(使用某种merge-alghoritm),并将操作(添加、删除、修改)直接应用于DB。(我愿意接受这种比较算法的建议)

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

  • 其他更好的办法


感谢4Reading

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


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

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


一个潜在的增强,是考虑急于(读取所有记录)与懒惰(读取记录根据需要)加载你的缓存。< /p> 在同一事务中的两个语句。(不幸的是,SQLite不支持重复密钥更新ish功能,但它是“Lite”:P)

首先,插入或忽略 然后 更新yourtable SET data=hashTableData,其中id=hashTableId和data!=哈希表数据

您可能能够识别哪些已被忽略。我会尝试做两个准备好的语句,我猜如果触发ignore子句,execute将返回false。试试看

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


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

您的意思是说idTable是每个表的ID?数据是数据库中的表名吗?@harigm哦,不,这不是我的意图,我将其重命名为idRecord,这些都是非常简单的表,ThanksQlite确实接受插入或替换,这可能与重复键更新时所需的
行为相匹配。请看这里:这在这里并没有真正的帮助,因为他只需要更新数据!=hastTableDate,据我所知,INSERT或REPLACE不允许我检查(您可以使用INSERT、select和on dup键组合使用mysql)
idRecord | Data   (modified table stored at objTable)    
2         Two
4         FourModified
5         Five