基于Android和MySQL的邮件检索
一、整体实现基本情况
1、 问题描述
通过Java和MySQL实现检索安然公司的51万封邮件。
2、 实验环境
IDE:IntelliJIDEA,AndroidStudio工具:MySQL,Navicat服务器:腾讯云
3、 实现简述
本次实验主要是在本地建好MySQL表,用Java程序读取51万封邮件并做相应切割后存入数据库中,然后购买了一台腾讯云服务器,在服务器上部署MySQL,使用工具Navicat将本地数据库部署上云。再在AndroidStudio上实现UI界面,并用客户端直连服务器数据库进行查询操作。
实现主要包含2个主要Java文件。
(1)【IDEA】SaveDataToMysql.java:读取所有文件并进行关键信息的切割,连接MySQL数据库,将路径(Path)、标题(Subject)、发件人(Author)、收件人(Addressee)、邮件内容(Content)存入MySQL中。将517401封邮件的信息全部存入MySQL中。
MySQL建表:
CREATE TABLE`Email`(
`Path` VARCHAR(500)NOTNULL,
`Subject` VARCHAR(500),
`Author` VARCHAR(500),
`Addressee` VARCHAR(500),
`Content` LONGTEXT,PRIMARYKEY(`Path`));
(2)【AndroidStudio】MainActivity.java:实现交互界面,用户输入检索类型和检索内容,有未输入的则报错。输入合法则连接服务器上的MySQL后进行检索,并将结果返回给用户。
4、 效果展示
二、【IDEA】SaveDataToMysql.java
1、 基本情况
包含3个步骤
(1)getFiles():获取所有邮件的绝对路径
(2)getData():遍历所有邮件,截取关键信息(标题、发件人、邮件内容)。
(3)InsertMysql():数据插入MySQL中。
2、 getFiles()
将path下所有文件的绝对路径保存在一个List中并返回。
3、 getData()
该函数遍历所有邮件,截取有用信息,存成一个DATA类的示例,最后返回一个List
4、 InsertMysql()
List中的数据插入MySQL中。
三、【Android】MainActivity.java
1、基本情况
主界面做用户的输入合法性判断,用户选择需要检索的类型(主题、寄件人、收件人、内容)和输入检索的内容后点击“确定”按钮。主线程启动子线程用于查询数据库,子线程连接腾讯云服务器上部署的MySQL数据库,并发送相应的SQL语句,服务器返回查询结果后,子线程通过Handler给UI界面传递信息,并在UI上将结果展示给用户。
2、Handler
全局Handler用户等待子线程的返回,子线程返回的msg.what=1是正常返回,msg.obj中存放着检索结果。调用ShowResult函数展示给用户。若返回的msg.what=2是不正常返回,调用Toast告知检索失败。
3、ShowResult()
在控件AlertDialog上展示子线程查询服务器上MySQL查询的结果。
4、SearchEmail()
对用户的输入和合法性进行判断,若用户输入不合法,则弹出toast进行提示;若用户输入均合法,则拼接SQL语句并启动子线程进行数据库查询。
5、DBconnection类与linkMysql()
类中的常量信息为数据库基本信息
主要函数linkMysql()的功能为连接数据库,然后执行SQL语句并获取查询结果,将结果(邮件的Path)存放在一个Vector中,然后通过sendMessage返回给Handler并告知执行成功。
四、遇到的问题
1、Java导入MySQL库参考:
IDEA连接数据库(导入jar包)_idea 连接数据库jar包-CSDN博客
2、MySQL中存储邮件内容时,一开始使用VARCHAR类型,后来发现有的邮件过长无法存储,改成TEXT,还是不行,后来改成LONGTEXT类型。
3、Javaheapspace:邮件太多,分2-3次录入MySQL。
4、AndroidStudio导入MySQL的jar不能导入太高的版本,原先导入IDEA的8以上版本根本运行不了,后来换成5的运行成功。
5、AndroidStudio中连接MySQL需要调用子线程,不能在主线程运行,涉及线程的同步互斥问题,采用了Handler的方式解决。一开始尝试忙等待发现不行,暂时还不知道为什么。
6、连接数据库时出现【Accessdeniedforuser'root'@服务器ip】的问题,应该权限出错,尝试解决未果,直接在服务器中修改配置文件,把MySQL的拦截关掉了,所有用户直接无密码登录,有风险,暂未解决。
五、改进方案
本实验直接让客户端APP操作后端数据库,实际应用中十分危险,应该在服务器中开发后台Java程序,让客户端和后台通过网络Socket编程进行交互,然后后端程序对客户端请求进行合法性判断,并操作MySQL。