軽量の、だがしかし高性能なデータベース InterBase / IBLite を iOS / Android で利用する[JAPAN]

Posted by on in Programming

軽量の、だがしかし高性能なデータベース InterBase / IBLite を iOS / Android で利用する

世の中にはデータベースが数多く存在します。たとえばこのデータベースのサイト「DB-Engines」を見ると、それだけで300以上のデータベースが並んでいます。
その中でおおよそ40位程度にランクしていて、知っている人は知っていて、重宝しているというデータベースを紹介します。

その名も InterBase 。

オープンソース DBの FireBird が上記の DB-Engines のランキングで 30位ぐらいなので、FireBird の方ををご存知の方も多いかもしれません。 InterBaseは FireBirdの元となったDBであります。

このInterBaseは、広範囲にサポートができ、かつ小回りの効くDBです。つまり、多くのOSをサポートし、RDBMSとして十分かつパワフルな機能を持ちつつも、小さな容量で、エンタープライズサーバーからモバイルアプリまで対応します。

InterBaseは使用する範囲とライセンスで呼び名が変わります。範囲とライセンスはこちらで確認できます。
今回はInterBaseの中でもDelphi / C++Builderを持っていれば、無料で使えるIBLiteを使用して、モバイルアプリへの組み込み手順をご紹介します。

手順は大きく分けて下記の通り。この手順にて説明を進めていきます。

  • IBLiteのライセンス取得と準備
  • IBLite の接続とTABLE作成
  • TABLEへのアクセスと、ユーザーインタフェース系の配置
  • iOS / モバイルデバイス向けの設定

使用環境

使用した環境情報を掲載しておきます。

項目 バージョン等
開発環境OS Windows 10 version 1703 (VMware上)
配置先のiOS iOS 10.3.2 (iPhone7)
開発環境 RAD Studio 10.2 Tokyo
データベース InterBase XE7 version 12.1.0.142

IBLiteのライセンスを取得する

無料で使えるのにライセンス取得? と思った方、そのとおりです。
無料と言っても、開発環境の Delphi / C++Builder /RAD Studio のProfessional エディション以上のライセンスをお持ちであれば、無料で使える、というものなので、最初にライセンスを取得しておく手順が必要なのです。
でもこれで読まずに離れてしまうのではもったいない!InterBaseは多数のOSをサポートし、モバイルでも、デスクトップでも同一コードで使えるするクロスプラットフォーム開発にぴったりなデータベースなのです。Delphi / C++Builderを使えばとても効率よく複数OS対応アプリを作ることができます。ここでは、WindowsでもmacOSでもiOSでもAndroidでも動作するクロスプラッフォーム開発のDB接続手順をご紹介していきます。

では本題。

必要情報の確認

IBLiteをiOS/Androidで動作させるためには、ライセンスファイルが必要となります。そのライセンスファイルの取得の方法と、配置準備についてこのパートでは説明します。

まず、ライセンスファイルを取得する上で、必要とする情報は、IBLite のシリアル番号_登録コード2つです。この二つは
Delphi / C++Builder / RAD Studio を購入した際に送られてくるメールで、タイトルは「Embarcadero Serial Number License Certificate」となっているメールに記載されています。このメールは、下記のシリアル番号が記載されています。

  • Delphi / C++Builder / RAD Studio のシリアルナンバー(インストール番号)
  • InterBase ToGo 開発時ライセンスのシリアルナンバー
  • IBLite for All Platform の配置ライセンスのシリアルナンバー

そして登録コード(Registration Code)も記載されています。 ちなみに登録コードは通常 737479 です。

IBLiteのシリアル番号と登録コードを見つけられたら次のステップに入りましょう。上記のようにライセンス情報が掲載されているメールには3種類のシリアルキー情報が掲載されていますので、お間違えの無いように
IBLite XE7 for All Platforms - Deployment License」と記載されているシリアル番号をご用意ください。

ライセンスファイルの取得

それでは以下手順に従ってライセンスファイルの取得を行います。

  1. 「使用許諾コードの登録」ページにアクセス
  2. 「Serial Number」の欄には先ほど用意した IBLite のシリアルキーを入力。 何度も言いますが、RAD Studioのシリアルキーではなく、IBLiteのシリアルキーを入力
  3. 「登録キー (コード/Registration Code)」欄には同じくメールに記載してあった登録キーを入力。通常は「737479」
  4. 入力したら「次へ」をクリックして、「使用許諾コードの登録」画面に移行 使用許諾のコードの登録.PNG

  5. エンドユーザー使用契約書をよくお読みになった後、使用許諾ファイルをダウンロードで取得するか、電子メールで受信するかを選び、電子メールを選んだ場合にはメールアドレスを入力の上、「登録」ボタンをクリック

取得方法に「ダウンロード」を選んでいれば即座にダウンロードが始まります。電子メールを選んだ方は、メールで届いているはずですのでご確認ください。
これで「reg9999_9999999999999.txt」のようなファイルが取得できます。(9の文字にあたる部分は、実際には上記例とは異なる数字の羅列です)

ライセンスファイルの配置

次に、このファイルを、使いやすいように、とある場所に配置しておきます。以下の手順に従ってください。

  1. この「reg9999_9999999999999.txt」ファイル名をIBLiteで使う場合には、「reg_iblite.txt」という名前に変更
  2. このファイルをInterBaseの登録フォルダに移動、またはコピーします。通常デフォルトでインストールされていれば、をInterBaseの登録フォルダは、下記の場所です
    • C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBaseXE7

この場所は RAD Studioの [IBREDISTDIR]として環境変数に定義されている場所なので、アプリの配置設定時にいちいち長いパスを打ち込まなくてよく後々楽です。

これで、ライセンスファイルの配置は終了です。 次はいよいよIBLiteデータベースを使ったアプリ作りに入っていきましょう。

IBLite への接続とTABLE作成

  1. RAD Studioを起動
  2. 「マルチデバイスアプリケーションの新規作成」をクリックしたのち、「空のアプリケーション」を選んで[OK]をクリック

    image.png

  3. まずはプロジェクトを保存します。上部メニューの[ファイル] - [すべて保存]を選択しして、任意のフォルダ(フォルダ名は英数字の使用を推奨)にUnitとProjectファイルを保存します(デフォルトでUnit1.pas と Project1.dproj という名称で保存されます)
  4. RAD Sudioの右下の「ツール パレット」で「FireDAC」グループの中にある[ TFDConnection] コンポーネントをダブルクリックしてフォーム上に配置します。「FDConnection1」という名称で配置されます。
    image.png 

  5. フォーム上に配置されたFDConnection1 コンポーネントを右クリックし、[接続エディタ(c)...]を選択
  6. [FireDAC 接続エディタ]が開くのでTFDConnection のパラメータを次のように設定します。
    • [ドライバ ID]欄に[IBLite] に設定します。
    • 「DataBase」欄の横の空白をクリックします。フォルダマークがあらわれるので、そのフォルダマークをダブルクリックします。
    • 「開く」というダイログが表示されます。先ほどプロジェクトを保存したフォルダ内が表示されているはずです。(先ほどプロジェクトを保存した場所でなければ、その保存フォルダに移動してください。)
    • ファイル名に[IBLiteTest.gdb]とタイプして[開く]をクリックします(お好きな名称でOKですが、以後、この手順に出てくるIBLiteのDB名をお好きな名前で読み替えてください)。そもそもこんな名前のDBファイルは存在しないのですが、InterBaseではDBとなる該当ファイルが無ければいわゆる自動生成するモードがあります。なので、存在しないDBファイル名を指定しても良いのです。(この自動生成モードは後ほど設定します)
    • [User_Name]パラメータを sysdba に設定します。
    • [Password]パラメータを masterkey に設定します。
    • [CharacterSet]パラメータを UTF8 に設定します。
    • [OpenMode]パラメータを OpenOrCreateに設定します。(これが自動生成モード。DBが無ければ生成されます)
  7. 上記の設定をすべて行ったら、[テスト]ボタンをクリックして、接続をテストします。
  8. FireDACログインダイアログが表示されるので、[OK」ボタンをクリックします。設定が正しく行われていれば、「接続の確立が成功しました。」と表示されます。またこの時、ステップ「*」で設定したパスとファイル名でIBLiteのデータベースファイルが作成されています。 エラーになるようでしたら、設定に間違いがないかもう一度見直してください。
    image.png

  9. [OK]をクリックして、接続の成功ダイアログを閉じます。

    • 下記のようなダイアログが表示されたら、Windowsのスタートメニューから[Embarcadero InterBase XE7] - [InterBase Server Manager] を起動し、一度、「停止」させた後、再び「起動」してからお試しください。開発ラインセンスの制限で、1日に1回のDB再起動が必要な場合があります。
      image.png

  10. さて、IBLiteのデータベースファイルは作られましたが、テーブルがまだ存在しません。なのでテーブルを作っておきます。[SQL スクリプト]のタブをクリックします。

  11. CREATE TABLE MYTABLE(ID INTEGER NOT NULL PRIMARY KEY, NAME VARCHAR(20) NOT NULL) と記述して緑色の三角ボタンをクリックします。これはIDとNameのフィールドを持つMYTABLEという名称のテーブルを作るSQL文を実行しています。

  12. FireDACログインダイアログが表示されるので、[OK]をクリックします。
    image.png

  13. 下の空白に下記のように表示されれば成功です。MYTABLEが作成されました。エラーであれば文が間違っている可能性があります。見直して再度三角ボタンをクリックしてみてください。

    Running script [メイン] ...
    CREATE TABLE MYTABLE(ID INTEGER NOT NULL PRIMARY K ...
    Ok [00:00:00.015].
    Script [メイン] finished without errors [00:00:01.578].

  14. 「FireDAC接続エディタ」ウインドウの[OK]ボタンをクリックして閉じます。

  15. IDE(開発ツール、ここではDelphiのことをIDEと言います)左上の「構造」ペインで「FDConnection1」をクリックして選択状態にし、左下の「オブジェクトインスペクタ」の「プロパティ」タブで「LoginPrompt」を[False]にセットします。これで接続前にいちいちログインのためのダイアログが出なくなります。

  16. 同様に「Connected」の値を[True]にセットします。

これで IBLite データベースへ接続されている状態になりました。

データベースのTableへのアクセスと、ユーザーインタフェース系の配置

次にデータベースのテーブルにアクセスするコンポーネントを設定していきます。

1.IDE 右下のツールパレットから「TFDTable」を見つけ、フォームにドラッグアンドドロップしてください。「FDTable1」という名称で登録されます。
1.「FDTable1」をクリックして選択状態にし、IDE左下にあるプロパティ内の「TableName」に[MYTABLE]を設定します。 
image.png

  1. フォーム上の「FDTable1」を右クリックして表示されるコンテキストメニューの中から[ビジュアルにバインド]を選択します。
  2. RAD Studio下部に「LiveBindingデザイナ」が表示されます。左側にアイコン表示されている杖のマークの「LiveBindingウイザード」をクリックしてください。
    image.png 

  3. 「LiveBindingウイザード」が表示されます。このウイザードを使ってコンポーネントと、データ表示のグリッド(表)を結び付けることができます。[グリッドをデータソースとリンク]を選択して[次へ]をクリックします。
    image.png

  4. 「新規グリッド」タブ内の[TGrid]を選択し、[次へ]をクリックします。

  5. 「既存ソース」タブ内の[FDable1] を選択し、[次へ]をクリックします。

  6. [データソースナビゲーターを追加]のチェックボックスをONにして[完了]をクリックします。
    image.png

  7. フォームに新たにTGridとTBindNavigatorが追加されます。
    image.png

  8. フォーム上の「NavigatorBindSourceDB1」(三角矢印がたくさんついている細長いコンポーネント)を選択して、「プロパティ」の「Align」を[Top]に設定します。

  9. フォーム上の 「GridBindSourceDB1」(白い箱、表)を選択して、「プロパティ」の「Align」を[Client]に設定します。そうするとUIはこんな感じに設定されているはずです。
    image.png

  10. フォーム上の「FDTable1」を選択状態にし、プロパティの[Active] を[True]に設定します。 データベース内のMYTABLEへのアクセスが有効になり、関連付けられているGridBindSourceDB1のカラムにIDとNameが表示されるはずです。
    image.png

  11. TFDPhysIBDriverLink コンポーネントをフォームに追加します。

  12. TFDGUIxWaitCursor コンポーネントをフォームに追加します。

  13. Tableとの設定、UI設定は完了です。F9か実行ボタンをクリックして実行してみましょう。

ナビゲーションの[+]クリックしてレコードを新規追加し、IDとNameにデータを入力できます。✔(チェック)ボタンで登録されます。
image.png
基本のデータべースアクセスアプリができました!

ご参考: TBindNavigatorの使い方はこちらに記載されています。
http://docwiki.embarcadero.com/Libraries/Tokyo/ja/Fmx.Bind.Navigator.TBindNavigator

ボタン 用途
先頭へ データセット内の最初のレコードを現在のレコードに設定し、"先頭へ" ボタンと "前へ" ボタンを無効にします。"次へ" ボタンと "最後へ" ボタンが無効になっている場合は有効にします。
前へ 前のレコードを現在のレコードに設定し、"最後へ" ボタンと "次へ" ボタンが無効になっている場合は有効にします。
次へ 次のレコードを現在のレコードに設定し、"先頭へ" ボタンと "前へ" ボタンが無効になっている場合は有効にします。
最後へ データセット内の最後のレコードを現在のレコードに設定し、"最後へ" ボタンと "次へ" ボタンを無効にします。"先頭へ" ボタンと "前へ" ボタンが無効になっている場合は有効にします。
挿入 現在のレコードの前に新しいレコードを挿入し、データセットを挿入および編集の状態に設定します。
削除 現在のレコードを削除し、次のレコードを現在のレコードにします。
編集 データセットを編集状態にして現在のレコードを変更できるようにします。
登録 現在のレコードに対する変更をデータベースに書き込みます。
キャンセル 現在のレコードに対する編集を取り消して、レコードの表示を編集前の状態に戻します。挿入および編集の状態がアクティブになっている場合は非アクティブにします。
更新 関連付けられているデータセットのバッファリングされているデータを更新します。編集されたすべてのレコードの編集を取り消し、レコードの表示を編集前の状態に戻し、挿入および編集を非アクティブにします。

iOS / モバイルデバイス向けの設定

上述の手順でWindows上で動くIBLite(InterBase)を使ったデータアクセスアプリケーションの基本アプリができました。このアプリをiOSで動作するように少々手を加えます。IBLiteのデータベースファイルがモバイル側に登録されるように設定するのです。
それからモバイル上で動作するとき、データベースファイルのパスは当然ながらWindowsで動作する場合とは異なる場所となりますので、その動作場所をモバイルデバイス時には変えてあげるように記述します。

また、iOSアプリを作るのは、iOS向けに開発環境を設定したり、macOS機を用意してXcodeをインストールしておく必要があります。
iOS作成のセットアップを行っていない方は、こちらの記事を参考にセットアップを行ってください。

IBLiteのデータベースファイルがモバイル側に登録されるように設定

  1. データベースのある場所(前述の手順に従っていれば、プロジェクトファイルと同じ場所)をエクスプローラーで開き、データベースファイル [IBLiteTest.gdb] を[プロジェクト マネージャ]内のプロジェクトにドラッグ アンド ドロップします。
  2. ファイルをプロジェクトに追加するかどうかを確認するダイアログ ボックスで[はい]をクリックします。
  3. データベース ファイルを追加すると、[機能ファイル]ウィンドウが開きます。[機能ファイル]で[InterBase ToGo]のチェックボックスをONにして[OK]をクリックして、[機能ファイル]ダイアログ ボックスを閉じます。

  4. IDE上部メニューの[プロジェクト] - [配置]を選択して配置マネージャを開きます。

  5. 配置マネージャ上部のターゲット プラットフォームのドロップダウン リストで、ビルド対象となるプラットフォームを選択して、 データベースIBLiteTest.gdb がプラットフォームに追加されていることを確認します。

    • iOS 32bit 向けにデバッグ構成でアプリを作る場合には[Debug 構成 - iOS デバイス - 32 ビット プラットフォーム]
    • iOS 64bit 向けにデバッグ構成でアプリを作る場合には[Debug 構成 - iOS デバイス - 64 ビット プラットフォーム]
    • Android向けの場合には、[Debug 構成 - Android プラットフォーム] image.png

  6. iOS プラットフォームと Android プラットフォームで、IBLiteTest.gdb の[リモート パス]がどのように設定されているかを確認します。

    • iOS デバイス プラットフォームなら: StartUp\Documents\
    • Android デバイス プラットフォームなら:.assets\internal\

IBLiteのライセンスファイルが登録されていることを確認する

上記の配置マネージャが表示されている際に、もうひとつ確認しておきます。上述「ライセンスファイルの配置」の時に
reg_iblite.txt」という名前に変更したファイルをInterBaseの登録フォルダに移動、またはコピーしておいています。これが、正しく登録設定されているか、確認しておきます。

  1. 配置マネージャ上部のターゲット プラットフォームのドロップダウン リストで、ビルド対象となるプラットフォームを選択して、 reg_iblite.txt がプラットフォームに追加されていることを確認します。
    • iOS 32bit 向けにデバッグ構成でアプリを作る場合には[Debug 構成 - iOS デバイス - 32 ビット プラットフォーム]
    • iOS 64bit 向けにデバッグ構成でアプリを作る場合には[Debug 構成 - iOS デバイス - 64 ビット プラットフォーム]
    • Android向けの場合には、[Debug 構成 - Android プラットフォーム]
  2. iOS プラットフォームと Android プラットフォームで、 reg_iblite.txt の[リモート パス]がどのように設定されているかを確認します。
    • iOS デバイス プラットフォームなら: StartUp\Documents\interbase\license\
    • Android デバイス プラットフォームなら:.assets\internal\interbase\license\

image.png

データベースのファイル場所をモバイルデバイス時には変えるように記述

  1. IDEの上部に「Unit1」タブをクリックして、配置情報からフォーム表示に戻ります。もしくは、Shift+F12キーを押して、またはIDEメニューの[表示] - [フォーム]を選択して、「フォームの検索」ダイアログを開き、[Form1]を選択し、[OK]をクリックして、フォーム表示画面に移動します。
  2. IDE左上の「構造」ペイン上の「FDConnection1]をクリックして選択状態にしてから、左下の「オブジェクトインスペクタ」の「イベント」タブをクリックし「BeforeConnect」イベントの左側空白をダブルクリックしてイベントハンドラのコード記述部ににジャンプします
  3. 下記のコードを記載します。これはFDConnection1がデータベースに接続する前に、iOSやAndroidであれば、データベースの場所定義('Database')にOSのドキュメントpath + DBファイル名 を組み合わせて設定しています。
//delphiコード
procedure TForm1.FDConnection1BeforeConnect(Sender: TObject);
begin
  {$IF DEFINED(iOS) or DEFINED(ANDROID)}
  FDConnection1.Params.Values['Database'] :=
      TPath.Combine(TPath.GetDocumentsPath, 'IBLITETEST.GDB');
  {$ENDIF}
end;

Delphiの場合、さらに Uses にSystem.IOUtilsを加えてください。(TPathを使ってOSのドキュメントパスを取ってくるために必要)

//C++Builder コード
void __fastcall TForm1::FDConnection1BeforeConnect(TObject *Sender) {
#if defined(_PLAT_IOS) || defined(_PLAT_ANDROID)
    FDConnection1->Params->Values["Database"] =
        System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath
        (), "IBLITETEST.GDB");
#endif
}

C++Builderの場合#include <System.IOUtils.hpp>を加えてください。(TPathを使ってOSのドキュメントパスを取ってくるために必要)

これでモバイルデバイス向けの設定は完了です。

macOSにiPhoneを接続し、macOSでPAServerを起動、IDE側の 接続プロファイルマネージャー で接続できることを確認の上、ターゲットプラットフォームにiOSデバイス-64ビットを指定し、ビルド・実行を行って下さい。 iPhoneにアプリが配置されます。
Androidでしたら、Windows向にUSBケーブルで接続し、開発者モードを設定してビルド、実行を行ってください。
このあたりのモバイルデバイス向けの準備配置設定は、繰り返しになりますが、こちらをご参照ください。

モバイルデバイス上ででIBLiteデータベースアクセスアプリが動作しました!
IMG_1784.PNG

おわりに

手順的にはだいぶ長くなりましたが、一度設定してしまえば、あとは簡単。いつでもIBLiteを使用できます。 お試しください~

参考Docwiki:モバイル チュートリアル:FireDAC で InterBase ToGo を使用する(iOS および Android)

 http://forms.embarcadero.com/developer-camp-overview

 



About
Gold User, No rank,
Sales consultant - Embarcadero Technologies , at Japan Twitter : @kazaiso

Comments

Check out more tips and tricks in this development video: