作者swallowcc ()
看板java
标题[问题] jar 档里面的 sqlite
时间Sun Apr 12 13:28:01 2020
因为最近有个需求要写个 client 的小程式
所以打算在 jar 里面嵌一个 sqlite db 去记录一些简单的设定, 不过踩到了地雷。
目前 sqlite db 是放在 resource/sqlite 资料夹里面
连线设定是这样的
https://i.imgur.com/hy9Qv5P.jpg
不过测试中发现,用 ui 工具 (sqlite browser) 点开 db 後没看到写入的资料。
但用程式去读取测试时,还是有看到那些资料列出。
这状况不管是在 IDE 里面跑,或者包成 jar 跑时都一样。
然後包成 jar 执行还有一个特殊状况...
先把同一个设定的 jar 分别命名成 a.jar 跟 b.jar。
执行完 a.jar 之後结束并砍掉 a.jar 程式,然後将 b.jar 更名成 a.jar 後执行,
居然发现更名完的 b.jar 可以读取到刚刚经由 a.jar 新增的资料。
猜测可能是因为 sqlite db 在写入资料之前会产一些 cache 档案,
但这些档案并无法放进 jar, 所以便在 tmp 资料夹里面放着。
而 b.jar 更名之後可以直接去读那些 cache 档案,
因而产生 b.jar 也可以读到资料的状况。
(这两个 a b jar 解压缩後点开 sqlite db 也一样没资料)
不过这段就纯猜测而已,实际上不理解这个机制是怎样处理的。
最後是把连线字串里面 sqlite db 位置指成绝对路径,结果就正常了。
(也就是图片中标注起来那句)
...
所以想请问一下有没有人知道这个地雷是怎麽回事?
以及想问,如果想在 jar 里面放 sqlite 一般是怎麽做?
还是说通常不会塞进 jar ,只会拿到使用者不知道的固定位置摆着呢?
感恩~ <(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.216.102.98 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1586669283.A.B27.html
1F:→ ssccg: 如果只是纯读取就算了,有写入的话通常一定会copy出来用 04/12 16:15
2F:→ ssccg: 不会直接对资源档写入吧 04/12 16:16
原来如此 @@ 以前没这麽做过,还以为直接写就好,感谢~
3F:→ qrtt1: jar 就只是一个 zip 档,应该没有人想要反覆地解压缩,压缩 04/12 22:30
4F:→ qrtt1: 那个地方,本来就不是设计给你写入的地方。你就在使用者的 04/12 22:31
5F:→ qrtt1: $HOME 下,生个资料夹来放它吧。 04/12 22:31
给 user 使用时还是尽量希望把 db 藏起来啦...
虽然会被改的机率不高,但还是想至少做一点基本防护这样。
然後还要考虑 OS 跟多人使用问题 @@ 总之还是谢谢回应了~ 再思考看看。
※ 编辑: swallowcc (49.216.102.98 台湾), 04/12/2020 22:47:05
6F:→ dennisxkimo: 你也可以光明正大把db放着 只是内容都是加密的 04/13 12:55