Skip to Content
Author's profile photo Former Member

SAP HANA通过PhoneGap(Cordova)连接手机[翻译后转载]

原文链接:http://scn.sap.com/community/developer-center/hana/blog/2012/12/29/sap-hana-goes-mobile-with-phonegap-cordova

三天前,我在Packt出版社的朋友发给我一本免费的电子书,叫PhoneGap初学者向导。当我知道PhoneGap时我还从来没真正使用过它……所以当然,我第一个想法是……我要如何将它与SAP HANA结合起来?

两天前,我开始读这本书,并且安装PhoneGap……这完全是一种痛苦,而且并不起作用……因此我仅仅把它放到一边到来年……

昨天……我的程序员精神打动了我……从早上9点到晚上1130,我让自己投身于让PhoneGap运行的运动中,当然……是让它可以与SAP HANA结合在一起……这是我的故事……那么你就不用伤脑筋了。 😉

有了这些……我就基本准备好了……因为我少了Cordova-2.2.0.jar文件……所以……我做了以下这些……

  • 下载并复制commons-codec-1.7.jarCordova\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 HANAodyssey系统准备就绪……

在一开始……我最初的想法是……这应该很简单……我已经在PowerBuilder上做过,所以基本上我需要把ngdbc.jar导入到我的Eclipse项目中,而那是……错误的!不起作用……经过多次尝试都失败了……我最后看到一丝曙光……我从Eclipse里删除了项目……从我的BlagTestlibs文件夹里复制ngdbc.jar……重新导入到Eclipse里……神奇的是……我连接到了SAP HANA……

现在……让该连接工作是另一个噩梦……在本博客中中,我需要重拾几乎忘记的JavaJavaScript知识……并且……学习新的事物比如PhoneGapJQueryMobile……

但是……我想要试图长话短说,这样你不会觉得无聊……

  • 我创建一个名叫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, FLDATEPRICECARRID是一个从应用传过来的参数。因为我没有传递一个多维的数组,或者一个数组的数组,或者类似的……我只是简单地用一个“/”串联这些值来以后分隔它们。

  • 我修改了已经存在的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()取到它的内容,并且将其通过””转换成一个字符串。
  • 我们简单地把新创建的字符串分隔,并把它分配到变量中。
  • 我们加了几行到列表视图中,并且在结束的时候更新它。

    接着,我们就来到项目–>清空以重建我们的项目然后右击我们的项目文件夹,再选择运行通过–>安卓应用。/wp-content/uploads/2013/03/phonegap_sap_hana_01_170037.png

/wp-content/uploads/2013/03/phonegap_sap_hana_02_170038.png

/wp-content/uploads/2013/03/phonegap_sap_hana_03_170270.png

/wp-content/uploads/2013/03/phonegap_sap_hana_04_170271.png

这看上去花很长时间……但是收获却无比巨大……希望你喜欢它 🙂

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.