在開始這篇教程之前,你應該閱讀並執行下面教程:
- iOS開發指南(9):在iOS應用程序中使用ListBox組件來顯示TableView
這篇教程描述了在iOS Device上,通過dbExpress框架,來使用SQLite作爲一個本地數據存儲的基本步驟。
使用DBExpress來連接數據庫
dbExpress是一個十分快速的數據庫訪問框架,由Delphi編寫。RAD Studio爲很多主要的數據庫提供驅動,例如InterBase,Oracle,DB2,SQL Server,MySQL,Firebird,SQLite,和ODBC。你可以使用相同的過程來訪問這些不同的數據庫。
- 在iOS平臺,dbExpress支持InterBase ToGo,也支持SQLite。這些數據庫產品可以運行在iOSDevice上。
- 對於其他數據庫,例如,Oracle,你至少需要一個客戶端的庫。在Windows平臺上,客戶端的庫由一個DLL提供來連接數據庫。因爲,你需要使用中間層技術,例如DataSnap來在iOS Device上連接這些數據庫。
另一個討論如何在iOS Device上不使用客戶端的庫連接企業級數據庫的教程;請查看“iOS教程:在iOS客戶端應用程序中連接企業級數據庫”。
在Window環境下創建開發使用的數據庫
首先,你需要創建一下SQLite數據庫文件在你的Windows開發平臺下。使用如下步驟,以便於你可以使用Mobile Form Designer來設計你的iOS應用的用戶界面。
在Data Explorer中創建數據庫
1. 到Data Explorer中,右擊SQLite節點,然後選擇Add New Connection:
2. 定義連接的名稱,例如ShoppingList。
3. 指定數據庫文件的路徑:
4. 佔擊Advanced按鈕打開Advanced Properties對話框。
5. 更改FailIfMissing屬性爲Fale,然後關閉對話框:注:設置FailIfMissing爲False表示命令DataExplorer在文件不存在的情況下創建一個新的數據庫文件。
6. 點擊Test Connection按鈕。在這個操作中,如果數據庫文件不存在,那麼會創建一個新的。
在Data Explorer中創建表
1. 在Data Explorer上,選擇在SQLite節的ShoppingList節點,然後從下拉菜單中選擇New Table。
2. 指定標題爲ShopItem列的類型爲TEXT。
3. 點擊Save按鈕,然後指定一個表名(例如,Item。)
設計並配置用戶界面
這篇教程使用一個TListBox組件來作爲UI元素。
要配置一個ListBox組件,使用下列步驟:
1. 要創建一個HD FireMonkey Mobile Application,選擇File>New>FireMonkeyMobile Application-Delphi>Blank Application。
2. 拖放一個TToolBar到窗體上。
3. 拖放一個TButton到TToolBar組件上。
4. 在Object Inspector中設置如下屬性:
- 設置Name屬性爲ButtonAdd。
- 設置StyleLookup屬性爲addtoolbuttonbordered。
5. 拖放一個TButton到TToolBar組件上。
6. 在Object Inspector中設置如下屬性:
- 設置Name屬性爲ButtonDelete。
- 設置StyleLookup屬性爲deletetoolbutton。
- 設置Text爲Delete。
- 設置Visible爲False。
7. 拖放一個TLabel到TToolBar組件上。
8. 在Object Inspector中設置如下屬性:
- 設置Align爲alClient。
- 設置StyleLookup爲toollabel。
- 設置Text爲ShoppingList。
- 設置TextAlign爲taCenter。
9. 拖放一個TListBox組件在窗體上。
10. 在Object Inspector,設置ListBox組件的如下屬性:
- 設置Align屬性爲alClient,以便ListBox組件填充整個窗體。
連接數據
下面這些是連接在Data Explorer中已經定義好了的數據庫中的數據的基本步驟:
1. 在Data Explorer上選中Item表,然後拖放到Form Designer上。
注:這會創建兩個組件(ShoppingList:TSQLConenction以及Item:TSQLDataSet)到窗體上。
2. 在窗體上選中ShoppingList組件,然後更改Connected屬性爲True。
3. 在窗體上選中Item組件,然後更改Active屬性爲True。
4. 選擇View>LiveBindings Designer,然後LiveBindingsDesigner打開。
5. 選中Item組件中的ShopItem,然後拖動ShopItem到ListBox1。
下面這些步驟使用在SQLIite數據庫中的數據與用戶界面連接。如果這篇教程中你使用一個已經存在數據的表,現在應該可以在Form Designer中看到真實數據。
創建一個事件處理過程,當用戶從列表中選中一個項目時來讓Delete按鈕顯示
Delete按鈕的Visible屬性設置爲False。因此,默認,用戶看不到這個按鈕。你可以在用戶在列表中選中一個項目時讓它可見,如下:
- 選中ListBox1,然後爲OnItemClick事件定義如下事件處理過程。
- procedure TForm1.ListBox1ItemClick(const Sender:TCustomListBox;
- const Item:TListBoxItem);
- begin
- ButtonDelete.Visible:= ListBox1.Selected <> nil;
- end;
procedure TForm1.ListBox1ItemClick(const Sender:TCustomListBox;
const Item:TListBoxItem);
begin
ButtonDelete.Visible:= ListBox1.Selected <> nil;
end;
爲Add按鈕創建一個事件處理過程,來添加列表項
下一步是給應用程序添加一個功能,可以添加一個項目到Shopping List中去。
1. 拖放一個TSQLQuery組件到窗體上。
2. 在Object Inspector中設置如下屬性:
- 設置Name屬性爲SQLQueryInsert。
- 設置SQLConneciton屬性爲ShoppingList。
- 設置SQL屬性如下:
INSERT INTO ITEM (ShopItem) VALUES (:ShopItem)
在Params屬性上的Expand(…)按鈕。
選中ShopItem參數,然後設置DataType爲ftString:
3. 在Form Designer中,雙擊AddButton組件。添加如下代碼到事件處理過程中:
- procedure TForm1.ButtonAddClick(Sender: TObject);
- var
- TaskName: String;
- begin
- try
- if InputQuery('EnterNew Item', 'Name', TaskName) and (TaskName.Trim <> '') then
- begin
- SQLQueryInsert.ParamByName('ShopItem').AsString := TaskName;
- SQLQueryInsert.ExecSQL();
- Item.Refresh;
- ButtonDelete.Visible := ListBox1.Selected <> nil;
- end;
- except
- on e: Exceptiondo
- begin
- ShowMessage(e.Message);
- end;
- end;
- end;
procedure TForm1.ButtonAddClick(Sender: TObject);
var
TaskName: String;
begin
try
if InputQuery('EnterNew Item', 'Name', TaskName) and (TaskName.Trim <> '') then
begin
SQLQueryInsert.ParamByName('ShopItem').AsString := TaskName;
SQLQueryInsert.ExecSQL();
Item.Refresh;
ButtonDelete.Visible := ListBox1.Selected <> nil;
end;
except
on e: Exceptiondo
begin
ShowMessage(e.Message);
end;
end;
end;
InputQuery函數顯示一個對話框來要求用戶輸入文本。這個函數在用戶選擇OK按鈕時返回True,以便你可以在用戶選擇OK並且文本中包含一些數據時才添加數據到數據庫中。
爲Delete按鈕創建一個事件處理過程,來從列表中刪除一項
下一步就是給應用程序添加一個功能來從Shopping List中刪除一項:
1. 拖放一個TSQLQuery到窗體上。
2. 在Object Inspector中設置如下屬性:
- 設置Name屬性爲SQLQueryDelete。
- 設置SQLConnection屬性爲ShoppingList。
- 設置SQL屬性如下:
delete from Item where ShopItem = :ShopItem
選擇Params屬性的Expand(…)按鈕。
- 選中ShopItem參數,設置DataType爲ftString。
3. 在Form Designer中,雙擊DeleteButton組件。添加如下代碼到事件處理過程中:
- procedure TForm1.ButtonDeleteClick(Sender: TObject);
- var
- TaskName: String;
- begin
- TaskName := ListBox1.Selected.Text;
- try
- SQLQueryDelete.ParamByName('ShopItem').AsString := TaskName;
- SQLQueryDelete.ExecSQL();
- Item.Refresh;
- ButtonDelete.Visible := ListBox1.Selected <> nil;
- except
- on e: Exception do
- begin
- SHowMessage(e.Message);
- end;
- end;
- end;
procedure TForm1.ButtonDeleteClick(Sender: TObject);
var
TaskName: String;
begin
TaskName := ListBox1.Selected.Text;
try
SQLQueryDelete.ParamByName('ShopItem').AsString := TaskName;
SQLQueryDelete.ExecSQL();
Item.Refresh;
ButtonDelete.Visible := ListBox1.Selected <> nil;
except
on e: Exception do
begin
SHowMessage(e.Message);
end;
end;
end;
修改你的代碼來連接到在iOS上的本地數據庫文件
這個程序的基本功能已經實現了。之前在Data Explorer中,你在Windows上創建了一個數據庫文件。這個數據庫文件現在在你的iOS Device上不能使用了,除非你將它複製到iOS Device上或創建它。
你可以按照如下步驟創建一個SQLite數據庫和表:
指定在iOSDevice上的SQLite數據庫路徑
1. 在Form Designer中,選中ShoppingList組件。
2. 在Object Inspector中,雙擊BeforeConnect事件。
3. 添加如下代碼到事件處理過程中:
GetHomePath函數提供給你一個iOS應用的真實根目錄。強烈建議使用常量System.SysUtils.PathDelim,因爲PathDelim使用特定平臺的路徑分隔符(而不是寫死在代碼裏,例如\或/)。
如果不存在,那麼創建表
使用SQLite,當表不存在的時候,你可以創建一個表,通過使用CREATE TABLE IF NOT EXISTS
語句。你可以在TSQLConnection組件連接到數據庫之後,TSQLDataSet組件連接到表之前創建一個表。使用如下步驟:
1. 在Form Designer中,選中ShoppingList組件。
2. 在Object Inspector,雙擊AfterConnect事件。
3. 添加如下代碼到事件處理過程中:
- procedure TForm1.ShoppingListAfterConnect(Sender: TObject);
- begin
- ShoppingList.ExecuteDirect('CREATE TABLE IF NOT EXISTS Item (ShopItem TEXT NOT NULL)');
- end;
procedure TForm1.ShoppingListAfterConnect(Sender: TObject);
begin
ShoppingList.ExecuteDirect('CREATE TABLE IF NOT EXISTS Item (ShopItem TEXT NOT NULL)');
end;
在iOS Simulator或iOSDevice上運行你的應用程序
現在,你的應用程序可以準備運行了(選擇Run>Run)。