在安卓 APP 中集成 SPL
在手机APP中也需要进行结构化数据计算。安卓系统支持JAVA语言,本文介绍在安卓APP中如何集成SPL来进行结构化数据计算。
我们以较为常用的安卓开发工具Android Studio讲解,介绍2个SPL计算的小例子:
1、读取APP安装包中jar文件里的文本数据计算后在屏幕上显示结果。
2、读取网络上JSON格式的数据文件计算后在屏幕上显示结果,同时将结果保存到手机上。
1. 创建APP并授权
运行Android Studio,新建APP项目spldemo,包名为com.raqsoft.spldemo。因为例子2中需要访问Internet和保存文件到手机,所以需要给APP授予这些权限,如果你开发的APP不需要这些权限,则可跳过此步。打开项目的app/src/main/AndroidManifest.xml文件,添加访问Internet和读写SD卡的权限,如下图所示:
在APP运行时,还需手机用户同意授权,所以编写一个申请用户授权的方法,并在MainActivity.java的onCreate方法中调用。
运行APP时会弹出如下图所示的授权界面,用户点击“允许”按钮后,APP就有权限在SD卡上读写文件了。
(注:不同语言环境的载图可能不同,此图在中文安卓手机中截取)
2. 编写所需文件
2.1 SPL配置文件
SPL运行前需要装载配置文件设置一些环境参数,关于配置文件的说明请查阅SPL相关资料,本例所用的配置文件raqsoftConfig.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Config Version="2">
<Runtime>
<DBList>
</DBList>
<Esproc>
<charSet>UTF-8</charSet>
<dfxPathList>
<dfxPath></dfxPath>
</dfxPathList>
<dateFormat>yyyy-MM-dd</dateFormat>
<timeFormat>HH:mm:ss</timeFormat>
<dateTimeFormat>yyyy-MM-dd HH:mm:ss</dateTimeFormat>
<bufSize>65536</bufSize>
<localHost/>
<localPort>0</localPort>
<parallelNum>1</parallelNum>
<cursorParallelNum>1</cursorParallelNum>
<blockSize>1048576</blockSize>
<nullStrings>nan,null,n/a</nullStrings>
<fetchCount>9999</fetchCount>
</Esproc>
<Logger>
<Level>INFO</Level>
</Logger>
</Runtime>
<JDBC>
<Load></Load>
</JDBC>
</Config>
2.2 示例 1
本例读取文本文件内的数据,返回计算的结果。
编写所需的文本数据文件scores.txt,部分数据如下图所示:
编写SPL脚本文件calcLocalTxt.dfx,如下:
A |
B |
|
1 |
=file@s("scores.txt").import@t() |
//读出文件数据为序表 |
2 |
=A1.groups(Class;avg(English):English_avg, max(Maths):Maths_max) |
//按班级分组,统计各班英语平均分及数学最高分 |
3 |
return A2 |
//返回A2中的计算结果 |
A1中的@s选项表示首先在JAVA类路径中查找scores.txt文件,因为此文件会放进jar包中。
2.3 示例 2
读取网络上的JSON格式文件数据,进行过滤及排序计算,将计算结果写入手机SD卡的文本文件中,返回计算结果。
编写SPL脚本文件calcHttpJson.dfx,脚本设置一个参数orderAmount,脚本内容如下:
A |
B |
|
1 |
=httpfile("http://service.raqsoft.com.cn/order.json").read() |
//读出http文件数据为字符串 |
2 |
=json(A1) |
//将JSON格式字符串转化为序表 |
3 |
=A2.select(Amount>orderAmount).sort(-Amount) |
//筛选出订单金额大于参数orderAmount的订单,然后按订单金额倒序排列 |
4 |
=file("orders.csv").export@tc(A3) |
//将计算结果保存到orders.csv文件 |
5 |
return A3 |
//返回A3中的计算结果 |
A2中序表数据为:
最后将以上配置文件、数据文件、脚本文件都打包成jar文件,命名为spldemo.jar,如下:
3. 部署SPL所需jar文件
选择集算器安装根目录下lib目录里的jar文件,复制到APP项目的libs目录中。SPL中有很多jar文件,不需要全部复制进来,除了esproc-bin-xxxx.jar是必须的,其它的根据你APP中用到的功能来选择jar,jar文件对应的功能请查阅SPL相关资料说明。如本例中用到了JSON数据,只需另外再复制json-1.0.0.jar文件以及本APP的文件spldemo.jar。
4. 编写APP程序
以下程序均编写在MainActivity.java中。
4.1 SPL初始化
编写SPL初始化方法initSPL,并在onCreate中调用。
第3行装载SPL配置文件,第4行获取到本APP在SD卡中存取文件的目录路径,在第6行中将此路径设为SPL的主目录,SPL 脚本中的file函数使用相对路径时,就是相对于此主目录的。比如例2中的file("orders.csv")就会将orders.csv保存在主目录里。
4.2 执行脚本 dfx 的方法
编写executeDfx方法调用SPL JDBC执行脚本,返回计算结果java.sql.ResultSet对象。本例是将此对象转化成文本串用于显示在手机屏幕中,你的APP中可根据功能需要返回ResultSet后再进行其它后续处理,比如取得数据再参与其它计算、生成html页面、画出数据表格或图形等。
方法参数dfx是脚本文件的名称(不要扩展名),params是脚本的参数值,按参数的顺序列出。方法resultSetToString是将结果集对象ResultSet转成字符串。
调用SPL时,不一定要写dfx脚本文件,代码不复杂时可以直接写SPL语句,例如:
Statement st = con.createStatement ();
ResultSet rs = st.executeQuery("=file@s(\"scores.txt\").import@t().groups(Class;avg(English):English_avg, max(Maths):Maths_max)");
甚至可以在数据文件上使用SQL查询,例如:
ResultSet rs = st.executeQuery("select Class, avg(English) as English_avg, max(Maths) as Maths_max from {file@s(\"scores.txt\").import@t()} group by Class");
4.3 界面及功能设计
在屏幕顶端放置两个按钮,其下放一个多行文本控件用于显示计算结果,如下图所示:
LOCAL TXT按钮运行示例1,它的click事件方法为calcLocalText:
HTTP JSON按钮运行示例2,它的click事件方法为calcHttpJson:
示例2的脚本有参数,此方法中设置参数值为1000。
4.4 运行 APP
APP运行后,点击LOCAL TXT按钮,显示执行结果如下:
点击HTTP JSON按钮,显示执行结果(横屏)如下:
在文件管理器中查看,在主目录中生成了orders.csv文件。
(注:不同语言环境的载图可能不同,此图在中文安卓手机中截取)
【附件】 spldemo.zip
英文版