SAP HANA通过PhoneGap(Cordova)连接手机[翻译后转载]
三天前,我在Packt出版社的朋友发给我一本免费的电子书,叫PhoneGap初学者向导。当我知道PhoneGap时我还从来没真正使用过它……所以当然,我第一个想法是……我要如何将它与SAP HANA结合起来?
两天前,我开始读这本书,并且安装PhoneGap……这完全是一种痛苦,而且并不起作用……因此我仅仅把它放到一边到来年……
昨天……我的程序员精神打动了我……从早上9点到晚上11:30,我让自己投身于让PhoneGap运行的运动中,当然……是让它可以与SAP HANA结合在一起……这是我的故事……那么你就不用伤脑筋了。 😉
- 下载并解压Eclipse经典版。
- 下载并安装Android SDK。
- 下载并安装ADT插件。
- 下载并解压Corbova(PhoneGap)。
- 下载并安装Java SDK。
- 下载并安装Apache Ant。
有了这些……我就基本准备好了……因为我少了Cordova-2.2.0.jar文件……所以……我做了以下这些……
- 下载并复制commons-codec-1.7.jar到Cordova\libs文件夹下
- 我来到Cordova\android\framework\scr\org\apache\cordova并修改了文件CordovaWebView.java,注释了这两行……
- if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
settings.setNavDump(true);
- 使用CMD,我来到Cordova\android\framework文件夹并执行==> ant jar.
现在……我真的准备好了……所以我在Corbova里创建了一个名为Projects的文件夹……并再一次的我在CMD里做了如下事情……
- 在Corbova\Projects里==> create C:\Cordova\Projects com.BlagTest BlagTest
那会创建一个Blag_Test文件夹,包含所有与Cordova项目相关的文件。然后我就上传它到Eclipse,并且做了一系列测试来检验是否一切都如我所愿运行正常……是的……所以新的基于SAP HANA的odyssey系统准备就绪……
在一开始……我最初的想法是……这应该很简单……我已经在PowerBuilder上做过,所以基本上我需要把ngdbc.jar导入到我的Eclipse项目中,而那是……错误的!不起作用……经过多次尝试都失败了……我最后看到一丝曙光……我从Eclipse里删除了项目……从我的BlagTest下libs文件夹里复制ngdbc.jar……重新导入到Eclipse里……神奇的是……我连接到了SAP HANA……
现在……让该连接工作是另一个噩梦……在本博客中中,我需要重拾几乎忘记的Java和JavaScript知识……并且……学习新的事物比如PhoneGap和JQueryMobile……
但是……我想要试图长话短说,这样你不会觉得无聊……
- 我创建一个名叫MyClass.java的新类(我累了……所以忘掉这个愚蠢的名字)
MyClass.java |
---|
package com.BlagTest; import java.sql.*; import java.util.ArrayList; public class MyClass { public ArrayList<String> getData(String p_carrid){ Connection connection = null; ArrayList<String> carrid = new ArrayList<String>(); String data = “”; try{ Class.forName(“com.sap.db.jdbc.Driver”); try{ connection = DriverManager.getConnection(“jdbc:sap://XX.XX.XXX.XXX:30115″,”SYSTEM”,”manager”); } catch (SQLException e){ } } catch (ClassNotFoundException e){ } if(connection != null){ try{ String sqlstring = “select CONNID, FLDATE, PRICE from SFLIGHT.SFLIGHT where carrid = ‘” + p_carrid + “‘”; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sqlstring); while(rs.next()){ data = rs.getString(“CONNID”) + “/” + rs.getString(“FLDATE”) + “/” + rs.getString(“PRICE”); carrid.add(data); } } catch(SQLException e){ } } return carrid; } } |
在这个文件里,我所做的是建立一个JDBC连接到我建立在TK ucloud biz上的SAP HANA服务器。我从SFLIGHT表中选出了CONNID, FLDATE和PRICE,CARRID是一个从应用传过来的参数。因为我没有传递一个多维的数组,或者一个数组的数组,或者类似的……我只是简单地用一个“/”串联这些值来以后分隔它们。
- 我修改了已经存在的BlagTest.java文件
BlagTest.java |
---|
package com.BlagTest; import android.app.Activity; import android.os.Bundle; import org.apache.cordova.*; public class BlagTest extends DroidGap { private MyClass mc; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.init(); mc = new MyClass(); super.appView.getSettings().setJavaScriptEnabled(true); super.appView.addJavascriptInterface(mc, “MyCls”); super.loadUrl(“file:///android_asset/www/index.html”); } } |
这里,一般来说我们想要允许数据从Java传到JavaScript需要使用setJavaScriptEnabled(true),然后添加addJavaScriptInterface(mc, “MyCls”),我们要告知我们的类是如何被调用……我们通过JavaScript来调用它们。
- 最后……我从已经生成好的index.html文件里删除了所有内容,并且输入以下代码……
index.html |
---|
<html> <head> <title>SAP HANA from PhoneGap</title> <meta name=”viewport” content=”width=device-width, initialscale=1.0″></meta> <link rel=”stylesheet” href=”http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css“/> <script src=”http://code.jquery.com/jquery-1.7.1.min.js“></script> <script src=”http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js“></script> <script> function getData(){ var carridField = document.getElementById(‘carrid’); var getCarrid = carridField.value; var myArrayList = window.MyCls.getData(getCarrid); carridField.value = “”; $(“#content”).append(“<ul id=’list’ data-role=’listview’ data-inset=’true'</ul>”); $(“#content”).trigger(“create”); for(var i = 0; i < myArrayList.size(); i++){ var array = “” + myArrayList.get(i); array = array.split(‘/’); var _connid = array[0], _fldate = array[1], _price = array[2]; var list = “<li><p>CONNID: ” + _connid + “</p><p>FLDATE: ” + _fldate + “</p><p>PRICE: ” + _price + “</p></li>”; $(“#list”).append(list); } $(“#list”).listview(“refresh”); } </script> </head> <body> <div data-role=”page”> <div data-role=”content” id=”content”> <div align=”center”><h1>SAP HANA from PhoneGap</h1></div> Carrid: <input type=”text” id=”carrid” size=”2″/> <button id=”submitCarrid” onClick=”getData()”>Submit</button> </div> </div> </body> </html> |
这里我所做的……如下所示……
- 我有个输入文本框和一个按钮。在输入框里,我们将传输一个CARRID的值并且当按下按钮时,我们将调用一个JavaScript函数。
- JavaScript函数将从输入框中收集值,将使用window.MyCls.getData()调用我们的Java函数,并且传输CARRID参数。这应该返回一个数组列表……但是取而代之的是……它返回了一个对象……所以我们稍后需要处理它……
- 使用JQueryMobile我们将创建一个列表视图,就像一个类固醇的HTML表……那么我所喜欢JQueryMobile的是,我们只需要包括一行“link rel”和两行“script src”来让它运行……正如它从一个在线位置抓到的一样。
- 我们将要做一个从0到对象大小的FOR循环,然后将通过.get()取到它的内容,并且将其通过””转换成一个字符串。
- 我们简单地把新创建的字符串分隔,并把它分配到变量中。
- 我们加了几行到列表视图中,并且在结束的时候更新它。
接着,我们就来到项目–>清空以重建我们的项目然后右击我们的项目文件夹,再选择运行通过–>安卓应用。
这看上去花很长时间……但是收获却无比巨大……希望你喜欢它 🙂