Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » Mobile Link - クイック・スタート » Mobile Link チュートリアル » チュートリアル:XML との同期

 

レッスン 4:Mobile Link のダイレクト・ロー・ハンドリングを使用する Java のクラスの作成

このレッスンでは、ダイレクト・ロー・ハンドリングを使用して、クライアント・データベース内の OrderComments テーブルのローを処理します。ダイレクト・ロー・ハンドリング用に次のメソッドを追加します。

  • GetUpload   このメソッドは handle_UploadData イベントに使用します。GetUpload では、アップロードされたコメントを XML ファイルに書き込みます。

次の手順では、処理用メソッドを含む Java のクラスを作成する方法を示します。完全なリストについては、MobiLinkOrders コードの全リスト (Java)を参照してください。

♦  ダウンロード専用のダイレクト・ロー・ハンドリング用の Java のクラスを作成するには、次の手順に従います。
  1. Java を使用して、MobilinkOrders というクラスを作成します。

    テキスト・エディタまたは開発環境で次のコードを入力します。

    //Mobilink imports
    import ianywhere.ml.script.*;
    import java.io.*;
    import java.sql.*;
    
    //XML parser
    import javax.xml.parsers.DocumentBuilder; 
    import javax.xml.parsers.DocumentBuilderFactory;  
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.xml.sax.SAXException;  
    
    //DOM Objects
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    //For writing XML objects
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.dom.DOMSource;  
    import javax.xml.transform.stream.StreamResult; 
    
    public class MobiLinkOrders {
        // ...
    }
  2. クラスレベルの DBConnectionContext インスタンスおよび Document インスタンスを宣言します。Document クラスは、XML 文書をオブジェクトとして表します。

    DBConnectionContext _cc;
     Document _doc;

    Mobile Link サーバによって DBConnectionContext のインスタンスがクラス・コンストラクタに渡されます。DBConnectionContext には、Mobile Link 統合データベースとの現在の接続に関する情報がカプセル化されます。

  3. クラス・コンストラクタを作成します。

    クラス・コンストラクタが、クラスレベルの DBConnectionContext インスタンスを設定します。

    テキスト・エディタまたは開発環境で次のコードを入力します。

    public MobiLinkOrders( DBConnectionContext cc ) {
      _cc = cc;
    }
  4. GetUpload() メソッドを作成します。

    1. メソッドの宣言を作成します。

      テキスト・エディタまたは開発環境で次のコードを入力します。

      // method for the handle_UploadData synchronization event
      public void GetUpload( UploadData ut ) throws SQLException, IOException {
    2. Mobile Link クライアントからアップロードされた挿入をすべて取得します。

      テキスト・エディタまたは開発環境で次のコードを入力します。

      //  get an UploadedTableData for OrderComments
        UploadedTableData orderCommentsTbl = 
          ut.getUploadedTableByName("OrderComments");
       
        // get inserts uploaded by the MobiLink client
        ResultSet insertResultSet = orderCommentsTbl.getInserts();
    3. 既存の XML ファイル order_comments.xml を読み込みます。

      テキスト・エディタまたは開発環境で次のコードを入力します。

          readDom("order_comments.xml");
    4. 挿入された各ローを XML ファイルに追加します。

      テキスト・エディタまたは開発環境で次のコードを入力します。

          // Write out each insert in the XML file
          while( insertResultSet.next() ) {  
            buildXML(insertResultSet);
          }
    5. XML ファイルを書き込みます。

      テキスト・エディタまたは開発環境で次のコードを入力します。

      writeXML();
    6. ResultSet を閉じます。

      テキスト・エディタまたは開発環境で次のコードを入力します。

          // Close the result set of uploaded inserts
          insertResultSet.close(); 
  5. buildXML メソッドを作成します。

    テキスト・エディタまたは開発環境で次のコードを入力します。

      private void buildXML( ResultSet rs ) throws SQLException {  
        int order_id = rs.getInt(1);
        int comment_id = rs.getInt(2);
        String order_comment = rs.getString(3);    
    
        //Create the comment object to be added to the XML file
        Element comment = _doc.createElement("comment");
        comment.setAttribute("id", Integer.toString(comment_id));
        comment.appendChild(_doc.createTextNode(order_comment));
    
        //Get the root element (orders)
        Element root = _doc.getDocumentElement();
        
        //get each individual order
        NodeList rootChildren = root.getChildNodes();
        for(int i = 0; i < rootChildren.getLength(); i++) {
          //if the order exists, add the comment to the order      
          Node n = rootChildren.item(i);
          if(n.getNodeType() == Node.ELEMENT_NODE) {
            Element e = (Element) n;
            int idIntVal = Integer.parseInt(e.getAttribute("id"));
            if(idIntVal == order_id) {
              e.appendChild(comment);
              //The comment has been added to the file, so exit the function
              return;
            }
          }
        }
    
        //if the order did not exist already, create it
        Element order = _doc.createElement("order");
        order.setAttribute("id", Integer.toString(order_id));
        //add the comment to the new order
        order.appendChild(comment);    
        root.appendChild(order);
      }
  6. writeXML メソッドを作成します。

    テキスト・エディタまたは開発環境で次のコードを入力します。

      private void writeXML() {
    
        try {
     
          // Use a Transformer for output
          TransformerFactory tFactory = TransformerFactory.newInstance();
          Transformer transformer = tFactory.newTransformer();
     
          //The XML source is _doc
          DOMSource source = new DOMSource(_doc);
          //write the xml data to order_comments.xml
          StreamResult result = new StreamResult(new File("order_comments.xml"));
          transformer.transform(source, result);
               
        } catch (TransformerConfigurationException tce) {
          // Error generated by the parser
          System.out.println ("\n** Transformer Factory error");
          System.out.println("   " + tce.getMessage() );
    
          // Use the contained exception, if any
          Throwable x = tce;
          if (tce.getException() != null) x = tce.getException();
          x.printStackTrace();
          
        } catch (TransformerException te) {
          // Error generated by the parser
          System.out.println ("\n** Transformation error");
          System.out.println("   " + te.getMessage() );
    
          // Use the contained exception, if any
          Throwable x = te;
          if (te.getException() != null) x = te.getException();
          x.printStackTrace();
               
     }
    
      }
  7. readDOM メソッドを作成します。

    テキスト・エディタまたは開発環境で次のコードを入力します。

      private void readDom(String filename) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
          try {
            //parse the Document data into _doc
            DocumentBuilder builder = factory.newDocumentBuilder();
            _doc = builder.parse( new File(filename) );
     
          } catch (SAXException sxe) {
            // Error generated during parsing)
            Exception x = sxe;
            if (sxe.getException() != null) x = sxe.getException();
            x.printStackTrace();
    
          } catch (ParserConfigurationException pce) {
            // Parser with specified options can't be built
            pce.printStackTrace();
    
          } catch (IOException ioe) {
            // I/O error
            ioe.printStackTrace();
          }
    
      }
  8. Java コードを MobiLinkOrders.java という名前で作業ディレクトリ c:\MLobjxml に保存します。

  9. クラス・ファイルをコンパイルします

    1. Java のソース・ファイルが含まれるディレクトリに移動します。

    2. Java 用の Mobile Link サーバ API ライブラリを参照して MobiLinkOrders をコンパイルします。

      Java の場合は、install-dir\Java にある mlscript.jar を参照する必要があります。また、XML DOM ライブラリが正しくインストールされていることを確認する必要があります。次のコマンドを実行して Java クラスをコンパイルします。c:\Program Files\SQL Anywhere 11\ は SQL Anywhere 11 の実際のディレクトリに置き換えてください。

      javac -classpath "c:\Program Files\SQL Anywhere 11\java\mlscript.jar" MobiLinkOrders.java
詳細情報

同期論理の詳細については、Java による同期スクリプトの作成を参照してください。

ダイレクト・ロー・ハンドリングの詳細については、ダイレクト・ロー・ハンドリングを参照してください。


MobiLinkOrders コードの全リスト (Java)