このレッスンでは、ダイレクト・ロー・ハンドリングを使用して、クライアント・データベース内の OrderComments テーブルのローを処理します。ダイレクト・ロー・ハンドリング用に次のメソッドを追加します。
GetUpload このメソッドは handle_UploadData イベントに使用します。GetUpload では、アップロードされたコメントを XML ファイルに書き込みます。
次の手順では、処理用メソッドを含む Java のクラスを作成する方法を示します。完全なリストについては、MobiLinkOrders コードの全リスト (Java)を参照してください。
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 { // ... } |
クラスレベルの DBConnectionContext インスタンスおよび Document インスタンスを宣言します。Document クラスは、XML 文書をオブジェクトとして表します。
DBConnectionContext _cc; Document _doc; |
Mobile Link サーバによって DBConnectionContext のインスタンスがクラス・コンストラクタに渡されます。DBConnectionContext には、Mobile Link 統合データベースとの現在の接続に関する情報がカプセル化されます。
クラス・コンストラクタを作成します。
クラス・コンストラクタが、クラスレベルの DBConnectionContext インスタンスを設定します。
テキスト・エディタまたは開発環境で次のコードを入力します。
public MobiLinkOrders( DBConnectionContext cc ) { _cc = cc; } |
GetUpload() メソッドを作成します。
メソッドの宣言を作成します。
テキスト・エディタまたは開発環境で次のコードを入力します。
// method for the handle_UploadData synchronization event public void GetUpload( UploadData ut ) throws SQLException, IOException { |
Mobile Link クライアントからアップロードされた挿入をすべて取得します。
テキスト・エディタまたは開発環境で次のコードを入力します。
// get an UploadedTableData for OrderComments UploadedTableData orderCommentsTbl = ut.getUploadedTableByName("OrderComments"); // get inserts uploaded by the MobiLink client ResultSet insertResultSet = orderCommentsTbl.getInserts(); |
既存の XML ファイル order_comments.xml を読み込みます。
テキスト・エディタまたは開発環境で次のコードを入力します。
readDom("order_comments.xml"); |
挿入された各ローを XML ファイルに追加します。
テキスト・エディタまたは開発環境で次のコードを入力します。
// Write out each insert in the XML file while( insertResultSet.next() ) { buildXML(insertResultSet); } |
XML ファイルを書き込みます。
テキスト・エディタまたは開発環境で次のコードを入力します。
writeXML(); |
ResultSet を閉じます。
テキスト・エディタまたは開発環境で次のコードを入力します。
// Close the result set of uploaded inserts insertResultSet.close(); |
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); } |
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(); } } |
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(); } } |
Java コードを MobiLinkOrders.java という名前で作業ディレクトリ c:\MLobjxml に保存します。
クラス・ファイルをコンパイルします
Java のソース・ファイルが含まれるディレクトリに移動します。
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)
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |