下面按照解决矛盾的(填坑)顺序说一下。
一、功能实现
因为想把数据库嵌入程序,肯定就不能太大了。所以采用了 derby,一个非常小的数据库,只有 3MB 大小。这个数据库是完全用 java 编写的,可以嵌在应用程序中(我这个就是),也可以作为单独的数据库服务器(需要再加载另一个 jar 文件)。
BUG 1.1:某些按键功能不正常。
原因: 判断输入框( JTextFiled )判断为空条件不准确。
解决方法:
BUG 1.2:以姓名为空进行查询时,只能显示第一个手机号码。
原因:查询语句不正确和 getstring() 不正确。可以看出下图的两个查询语句的不同:”select * from” 和 “select phone from” ,前者是输出这一行的数据,一次while会输出两个语句,但是后者只会输出 phone 列的数据,一次只有一个语句。这样,在输出的时候会报错,造成只会输出第一个语句的假象。
解决方法:将str 设置为 str2 语句。
二、导出可运行的 jar 包
这一步时,生成的 jar 包,第一次按下按钮时,都会建立程序设定的 myDB 数据库文件夹。
除此之外,没有一点点的反应。
我一直以为是因为数据库没有成功导出的问题,一直在查怎么导出带数据库的 Jar 包,无功而返。
第二天再查的时候,给程序每一部分前后都加了语句,如果顺利进行会在内容栏输出对应语句。
然后我发现数据库是处于成功链接的状态的!前面几步都是成功的!
那么为什么没有输出?
我找到对应的失败地方,加上了输出错误原因的语句。
BUG 2.1:没有找到对应的表。
原因:打包时没有把建立的表加进去。
解决方案:增加了判断条件,补充建表功能。(造成BUG 2.4)
解决方案:默默去掉。
BUG 2. 3:某些按键不能输出对应范围的数据。
解决方案:完善判断逻辑。
BUG 2.4:程序只在第一次成功运行。
原因: 我没有考虑 try catch 来建表。而是创建了一个全局变量,但是第二次打开时全局变量会初始化。
解决方案:新增了“初始化”按钮,将初始化功能分离出来。(在第三版改善了这个操作)
最后,程序功能已经基本完善,可以本地保存数据,重复使用。初始化的时候会建立一个 myDB 文件夹和一个 derby.log 日志。删除这两个文件数据就没有咯。
三、打包为 exe
BUG 3.1:首先再尝试了一波 exe4j 打包工具,提示 jre 文件被破坏。
原因:在设置条件时候,没有选择“Generate 64-bit executeable”。32位系统直接默认就好,64位系统必须勾上这个选项。
解决方案:勾上这个选项。
需要注意的是,这个页面选择程序之前生成好的 jar 及主类就可以了。(derby.jar在生成的时候已经加在 addressList.jar 了,所以不需要再加了)(这个软件如果没有输入注册码,生成的软件会有提示)
Jar2Exe 程序也需要选择对应的位数,64位勾上就好了。32位不用。(这个软件相对简单)
接下来在没有 Java 环境的64位虚拟机上测试,复制本机的 jre 文件,设置相对路径的环境变量,exe 文件成功打开。
BUG 3.2:在没有 Java 环境的 32 位虚拟机上进行相同的测试。exe 文件打不开,提示 Java 环境被破坏。
原因: jre 也分 32 位与 64 位。
解决方案:下载一份32位 jre 替换。成功运行。
用 Inno 做成 exe 安装文件。成功。
最后一个大坑,如何精简 jre?这两个包解压缩后都是180mb,一个几Mb的小程序带这么大的环境吗。查了半天没有解决。只能暂时留着了。没有Java 环境的用户下载一个 jre 压缩包就好了,与 jar 包放在同一个目录下(环境变量好像有点问题=。=,推荐直接搭建JAVA环境)
最主要的是!!!捕获异常的重要性!!!切记!!!
源码地址:https://github.com/evenIfAlsoGo/someTools/tree/master/addressList
领取专属 10元无门槛券
私享最新 技术干货