Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

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

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

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

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

有了这些……我就基本准备好了……因为我少了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()取到它的内容,并且将其通过””转换成一个字符串。
  • 我们简单地把新创建的字符串分隔,并把它分配到变量中。
  • 我们加了几行到列表视图中,并且在结束的时候更新它。

    接着,我们就来到项目-->清空以重建我们的项目然后右击我们的项目文件夹,再选择运行通过-->安卓应用。

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