第 3 回 Open 棟梁でモバイルアプリ開発 (3)
こんにちは!Open 棟梁のモバイルアプリ開発での利用方法を紹介していますが、今回は 3 回目です。 今回は、ネイティブアプリでの活用サンプルをご紹介したいと思います。
ネイティブアプリでの Open 棟梁の利用
第 1 回でもご紹介しましたように、ネイティブアプリは OS ごとに Android は Java、iOS は Swift や Objective-C、Windows (UWP) は C#/VB のように開発言語が異なります。 このため、Android(Java) や iOS(Swift, Objective-C) では Open 棟梁は動作しません。 ただし、Open 棟梁の一部の部品は PCL(Portable Class Library) 化されていますので、PCL 化されている部品であれば、UWP(C#/VB) や Xamarin(mono) から利用できます。 このように、ネイティブアプリでは、一部を除き Open 棟梁を使うことはできませんが、以下のように、「サーバーサイド」のプログラムでは、Open 棟梁を使うことはできます。
今回は、Xamarin を使用して、以下のようなサンプルをご紹介します。
- Xamarin アプリケーションから、サーバーサイドの Web API を呼び出す
- Open 棟梁の F/D 層機能を利用してデータベースにアクセスし、結果セットを返す
- Web API から返ってきた結果セットを受け取り、Open 棟梁の「汎用 DTO」に復元する (汎用 DTOとは、さきほどご紹介した PCL 化された Open 棟梁の部品の一つで、Silverlight や UWP(C#/VB) でも利用可能な、DataSet や DataTable ライクのオブジェクトです)
なお、前回と同様、本ブログでは「ネイティブアプリで、Open 棟梁をどのように利用できるのか」に焦点を当てていますので、Xamarin の詳細な使い方などはご紹介していません。 Xamarin の詳細な使い方は、
CodeZineや
@ITなどに詳しく書かれていますので、こちらもご参照ください。
Web API アプリケーションを作成する
まず、サーバーサイドプログラムを実行するための Web API アプリケーションを作成しましょう。 Web API アプリケーションの作成方法は、第 2 回でもご紹介しましたとおり、SPA(シングルページ アプリケーション) のサンプルが参考になります。 ただし、今回は、Open 棟梁の部品と組み合わせるため、既存のプログラムを一部書き換えます。
- Visual Studio のソリューションエクスプローラーで、[Controllers]-[SampleController.cs] を開く
- SelectDTController クラスを以下のように書き換える (Xamarin プロジェクトで復元可能にするため)
// ファイルの先頭で、以下の名前空間をインポートしてください。
// using System.IO;
// using Touryo.Infrastructure.Public.Dto;
public class SelectDTController : ApiController
{
// POST api/SelectDT
public HttpResponseMessage Post(WebApiParams param)
{
// 引数クラスを生成
// 下位(B・D層)は、テスト クラスを流用する
TestParameterValue testParameterValue
= new TestParameterValue(
"CrudMu", "button1", "SelectAll_DT",
param.ddlDap + "%" + param.ddlMode1 + "%" + param.ddlMode2 + "%" + param.ddlExRollback,
new MyUserInfo("aaa", "192.168.1.1"));
// 戻り値
TestReturnValue testReturnValue;
// 分離レベルの設定
DbEnum.IsolationLevelEnum iso = DbEnum.IsolationLevelEnum.DefaultTransaction;
// B層呼出し+都度コミット
LayerB layerB = new LayerB();
testReturnValue = (TestReturnValue)layerB.DoBusinessLogic(testParameterValue, iso);
// 結果表示するメッセージ
string message = "";
if (testReturnValue.ErrorFlag == true)
{
// 結果(業務続行可能なエラー)
message = "ErrorMessageID:" + testReturnValue.ErrorMessageID + ";";
message += "ErrorMessage:" + testReturnValue.ErrorMessage + ";";
message += "ErrorInfo:" + testReturnValue.ErrorInfo;
Dictionary dic = new Dictionary();
dic.Add("Error", message);
return Request.CreateResponse(HttpStatusCode.OK, dic);
}
else
{
// 結果(正常系)
DataTable dt = (DataTable)testReturnValue.Obj;
dt.TableName = "Shippers";
// DataTable を、Open 棟梁の汎用 DTO に変換する
DTTables dtTables = new DTTables();
DTTable dtTable = DTTable.FromDataTable(dt);
dtTables.Add(dtTable);
using (StringWriter sw = new StringWriter())
{
dtTables.Save(sw);
return Request.CreateResponse(HttpStatusCode.OK, sw.ToString());
}
}
}
}
PCL 化された Open 棟梁のプロジェクトを追加する
次に、Xamarin プロジェクトから利用できるように、PCL 化された Open 棟梁のプロジェクトをソリューションに追加しましょう。 PCL 化された Open 棟梁のプロジェクトは、以下のパスにあります。
[Open 棟梁のルートパス]\programs\C#\Frameworks\PortableClassLibrary\PCLPublic\PCLPublic.csproj
Visual Studio のソリューションエクスプローラーで、ソリューションを右クリック→「既存のプロジェクト」で、プロジェクトを追加してください。
Visual Studio で PCLPublic プロジェクトを右クリックし、「プロパティ」を選択します。 「ターゲット」のところに Xamarin の各ターゲットがあることを確認してください。(なかった場合は追加してください)
Xamarin アプリケーションを作成する
次に、Xamarin アプリケーションを作成します。
- Visual Studio で、新規プロジェクトを作成する
Visual Studio で Xamarin アプリケーションを作成する場合、実行するプラットフォームによって使用するテンプレートが異なります。 使用するテンプレートについては、MSDN の記事を参照してください。 ここでは、Android で動作するアプリケーションを作るために、[新しいプロジェクトの追加] ダイアログで、[Android]-[Blank App (Android)] を選択して、プロジェクトを作成します。 - 先ほど追加した Open 棟梁のプロジェクトへの参照を追加する
- 画面を実装する
それでは、画面を作っていきましょう。 表示する画面は、ソリューションエクスプローラーの [Resources]-[layout]-[Main.axml] です。 ここに、Web API を呼び出すボタンと、Web API の結果を表示する TextView コントロールを定義します。<Button
android:id="@+id/MyButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="サンプル"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/MyText"
/>
- 処理を実装する
次は、ボタンを押したときに Web API を呼び出す処理を実装します。 処理は、ソリューションエクスプローラー直下の [MainActivity.cs] に実装します。 MainActivity クラスの onCreate メソッドを以下のように実装します。// ファイルの先頭で、以下の名前空間をインポートしてください。
// using System.IO;
// using System.Net.Http;
// using System.Net.Http.Headers;
// using Touryo.Infrastructure.Public.Dto;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
// ボタンと TextView コントロールを取得する
Button button = FindViewById<Button>(Resource.Id.MyButton);
TextView tv = FindViewById<TextView>(Resource.Id.MyText);
// ボタンクリックイベントを実装
button.Click += async delegate
{
string message = "";
try
{
HttpClient client = new HttpClient()
{
// Web API の URL を指定する
BaseAddress = new Uri("http://10.0.2.2/SPA_Sample/api/SelectDT")
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Web API に渡すデータ
FormUrlEncodedContent content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ "ddlDap", "SQL" },
{ "ddlMode1", "individual" },
{ "ddlMode2", "static" },
{ "ddlExRollback", "-" }
});
// Web API を呼び出す
HttpResponseMessage response = await client.PostAsync(client.BaseAddress, content);
if (response.IsSuccessStatusCode)
{
// Web API の結果を汎用 DTO に復元する
string result = await response.Content.ReadAsStringAsync();
result = result.Replace(@"\r\n", System.Environment.NewLine);
result = result.Substring(1, result.Length - 1);
DTTables dtTables = new DTTables();
using (StringReader sr = new StringReader(result))
{
dtTables.Load(sr);
message = string.Format("{0}件のデータがあります", dtTables[0].Rows.Count);
}
}
else
{
message = "HTTP Error! Status Code: " + response.StatusCode;
}
}
catch (Exception ex)
{
message = ex.Message;
}
finally
{
tv.Text = message;
}
};
}
動作確認
それでは、実際に動かしてみましょう。 Visual Studio で、Xamarin プロジェクトをデバッグ実行してみます。 「サンプル」ボタンをクリックすると、以下のように結果が表示されることを確認してください。
次に、Open 棟梁のログを確認してみましょう。 Open 棟梁はデフォルトでは C:\root\files\resource\Log フォルダにログを出力しますので、ここに ACCESS.xxxx-xx-xx.log や SQLTRACE.xxxx-xx-xx.log (xxxx-xx-xx は実行日付) のようなログが出力されていることを確認してください。 たとえば、SQLTRACE.xxxx-xx-xx.log には以下のようなログが出力されていると思います。
[2017/02/02 14:53:44,978],[INFO ],[30],58,0,[commandText]:SELECT * FROM Shippers [commandParameter]:
次回は、UWP での Open 棟梁の活用方法を見ていきたいと思います。