在安卓 APP 中集成 SPL

在手机APP中也需要进行结构化数据计算。安卓系统支持JAVA语言,本文介绍在安卓APP中如何集成SPL来进行结构化数据计算。

我们以较为常用的安卓开发工具Android Studio讲解,介绍2SPL计算的小例子:

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.javaonCreate方法中调用。

..

..

运行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中用到的功能来选择jarjar文件对应的功能请查阅SPL相关资料说明。如本例中用到了JSON数据,只需另外再复制json-1.0.0.jar文件以及本APP的文件spldemo.jar

..

 

4.   编写APP程序

以下程序均编写在MainActivity.java中。

4.1   SPL初始化

编写SPL初始化方法initSPL,并在onCreate中调用。

..

3行装载SPL配置文件,第4行获取到本APPSD卡中存取文件的目录路径,在第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