[问题] jar 档里面的 sqlite

楼主: swallowcc (guest)   2020-04-12 13:28:01
因为最近有个需求要写个 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 ,只会拿到使用者不知道的固定位置摆着呢?
感恩~ <(_ _)>
作者: ssccg (23)   2020-04-12 16:15:00
如果只是纯读取就算了,有写入的话通常一定会copy出来用不会直接对资源档写入吧
作者: qrtt1 (有些事,有时候。。。)   2020-04-12 22:30:00
jar 就只是一个 zip 档,应该没有人想要反复地解压缩,压缩那个地方,本来就不是设计给你写入的地方。你就在使用者的$HOME 下,生个资料夹来放它吧。
作者: dennisxkimo (Dennis(一上B就糟糕))   2020-04-13 12:55:00
你也可以光明正大把db放著 只是内容都是加密的

Links booklink

Contact Us: admin [ a t ] ucptt.com