移动教程:使用dbExpress和SQLite(iOS和Android)

来自RAD Studio
跳转到:航行,搜索

转到移动教程:移动应用程序开发(iOS和Android)


黄色棒棒糖.png注意:本教程中介绍的dbExpress正在已弃用这意味着dbExpress将在即将发布的版本中从RAD Studio中删除。
我们建议您使用较新的数据库解决方案,而不是dbExpress,消防DAC,在类似的教程中进行了描述,如下所示:
移动教程:使用FireDAC和SQLite(iOS和Android).

在开始本教程之前,您应该阅读并执行以下教程会话:

本教程描述了通过dbExpress框架在移动设备上使用SQLite作为本地数据存储的基本步骤。

网间网操作系统 安卓

IOS屏幕.png

Android屏幕.png

使用dbExpress连接到数据库

数据库Express是一个用Delphi编写的非常快速的数据库访问框架。RAD Studio为大多数主要数据库提供驱动程序,如InterBase、Oracle、DB2、SQL Server、MySQL、Firebird、SQLite和ODBC。您可以使用与此处描述的过程类似的过程访问这些不同的数据库。

  • 对于移动平台,dbExpress支持InterBase目标以及数据库。这些数据库产品可以在iOS和Android设备上运行。
  • 对于其他数据库(如Oracle),您至少需要一个客户端库。在Windows平台上,客户端库作为DLL提供以进行连接。因此,您需要使用中间层技术(如DataSnap)开发应用程序,以便从移动设备连接到这些数据库产品。

另一个教程讨论了如何在不使用移动设备上的客户端库的情况下连接到企业数据库;看见移动教程:从移动客户端(iOS和Android)连接到企业数据库.

在Windows环境中创建数据库以用于开发

首先,您需要在Windows开发平台上创建一个SQLite数据库文件。使用以下步骤,以便可以使用表单设计器设计应用程序的用户界面。

在数据浏览器中创建数据库

  1. 数据资源管理器,右键单击数据库节点并选择添加新连接:
    添加SQLiteConnection.png

  2. 定义连接的名称,例如购物清单.
    购物列表连接.png

  3. 指定数据库文件的位置:
    数据库位置文件.png

  4. 单击高级按钮并打开高级属性对话框。
  5. 更改故障IfMissing属性到False(错误)然后单击“确定”关闭高级属性对话框:
    300

    注:设置故障IfMissingFalse(错误)指示Data Explorer在文件不可用时创建新的数据库文件。
  6. 回到修改连接对话框中,单击测试连接按钮。使用此操作,如果不存在文件,则会创建新的数据库文件:
    连接测试.png
    注:确保sqlite3.dll存在于您的开发系统中。如果此文件不存在,请从下载sqlite3.dllhttp://www.sqlite.org/download.html到系统路径(例如C: \Windows\SysWOW6464位Windows)。

在DataExplorer上创建表

  1. 数据资源管理器,双击购物清单节点,在SQLite部分下单击鼠标右键桌子,然后选择新建表格从上下文菜单中选择。
    创建新SQLiteTable.png
  2. 设置数据类型对于商店商品列到文本.
    SQLiteDefineShopItemTable.png
  3. 单击保存按钮并指定表名(例如,项目.)
    指定SQLiteTableNameAsItem.png

设计和设置用户界面

可见UI组件加载到设计器中

本教程使用一个列表框组件组件作为UI元素。

要设置ListBox组件和其他UI元素,请使用以下步骤:

  1. 使用创建多设备应用程序文件>新建>多设备应用程序-Delphi文件>新建>多设备应用程序-C++Builder.
  2. 删除一个T工具栏在表格上。
  3. 删除一个按钮控件并在对象检查器:
  4. 删除一个按钮控件并在对象检查器:
  5. 删除一个T标签并在对象检查器:
  6. 删除一个列表框组件组件,并在对象检查器:
    • 设置排列属性到顾客,以便ListBox组件使用整个表单。

连接到数据

以下是连接到数据库中的数据的基本步骤,该数据库已在数据资源管理器:

  1. 选择项目上的表数据资源管理器并将其拖动到窗体设计器。
    从DataExplorerToiOSForm.png拖动表

    注:这将创建两个组件(ShoppinglitsConnection:TSQL连接和ItemTable:TSQL数据集)在表格上。
    购物列表和项目2.png

  2. 选择购物英语连接组件,然后更改有联系的属性到真的.
  3. 选择项目表组件,然后更改活动属性到真的.
  4. 选择查看>LiveBindings DesignerLiveBindings设计器打开。
  5. 选择商店商品在中项目表组件并拖动商店商品项目。文本属于列表框1.
    商店项目列表框.png

以下步骤将应用程序的用户界面与SQLite数据库上的数据连接起来。如果您在本教程中使用了包含现有数据的表,那么现在应该可以在表单设计器中看到实际数据。

创建事件处理程序,以便在用户从列表中选择项目时显示删除按钮

这个可见属性删除按钮设置为False(错误)因此,默认情况下,最终用户看不到此按钮。当用户选择列表中的项目时,可以使其可见,如下所示:

德尔福:

程序 T形1.列表框1项目单击(常数 发件人: T自定义列表框;
  常数 项目: T列表框项目);
开始
  如果 列表框1.挑选出来的 <>  然后
    按钮删除.可见 := 真的
  其他的
    按钮删除.可见 := False(错误);
结束;

C++生成器:

空隙 __快速呼叫 T形1::列表框1项目单击(常数 T自定义列表框 *发件人,常数 T列表框项目 *项目)
{
        如果 (列表框1->挑选出来的)
                按钮删除->可见 = 真的;
        其他的
                按钮删除->可见 = False(错误);
}

为“添加”按钮创建事件处理程序以向列表中添加条目

还配置了数据库连接

下一步是向该应用程序添加一个功能,用于将项目添加到购物列表。

  1. 删除一个TSQLQuery(TSQL查询)组件添加到表单中。
  2. 在中设置以下属性对象检查器:
    • 设置姓名属性到SQLQuery插入.
    • 设置SQL连接属性到购物英语连接.
    • 按如下所示设置SQL属性:
      插入商品(商店商品)价值(:商店商品)
    • 选择展开上的(…)按钮参数属性。
    • 选择商店商品参数和设置数据类型ftString(英尺字符串):
      编辑ShopItemParameter.png

  3. 在表单设计器中,双击按钮添加组件。将以下代码添加到此事件处理程序:

德尔福:

程序 T形1.按钮添加单击(发件人: TObject(目标));
开始
  TDialogServices异步.InputQuery(输入查询)('输入新项目', [“名称”], [''], 自我.OnInputQuery_Close(输入查询关闭));
结束;

程序 T形1.OnInputQuery_Close(输入查询关闭)(常数 A结果: TModal结果; 常数 A值: 阵列 属于 一串);
无功功率,无功功率
  任务名称: 一串;
开始
  任务名称 := 一串.清空;
  如果 A结果 <> mrOk先生 然后
    出口;
  任务名称 := A值[0];
  尝试
    如果  (任务名称.修剪 = 一串.清空) 然后
    开始
      SQLQuery插入.参数按名称(“商店商品”).作为字符串 := 任务名称;
      SQLQuery插入.执行SQL();
      项目表.刷新;
      将填充控件链接到字段1.绑定列表.FillList(填充列表);
      如果 列表框1.挑选出来的 <>  然后
        按钮删除.可见 := 真的
      其他的
        按钮删除.可见 := False(错误);
    结束;
  除了
     前任: 例外 
      显示消息('错误:' + 前任.消息);
  结束;
结束;

在Form类的私有部分下声明此过程原型:

私有的
    程序 OnInputQuery_Close(输入查询关闭)(常数 A结果: TModal结果; 常数 A值: 阵列 属于 一串);


C++生成器:

要在C++中复制相同的功能,需要额外的步骤:

1.在TForm1定义之后添加下一个类型定义:

类型定义 空隙 __快速呼叫 (__闭合 *TInput关闭查询过程事件)(常数 系统::Ui类型::TModal结果 A结果,
        系统::Unicode字符串 常数 *A值, 常数 整数 A值_高);

2.添加下一个类定义:

 输入查询方法 : 公众的 TCpp接口对象<TInput关闭查询过程>
{
私有的:
    TInput关闭查询过程事件 事件;

公众的:
    输入查询方法(TInput关闭查询过程事件 _事件) {
        事件 = _事件;
    }

    空隙 __快速呼叫 援引(常数 系统::Ui类型::TModal结果 A结果,
        系统::Unicode字符串 常数 *A值, 常数 整数 A值_高) {
        事件(A结果, A值, A值_高);
    }
};

3.在表格的私人部分添加下一个声明:

空隙 __快速呼叫 OnInputQuery_Close(输入查询关闭)(常数 系统::Ui类型::TModal结果 A结果,    
    系统::Unicode字符串 常数 *A值, 常数 整数 A值_高);

4.添加实际功能:

空隙 __快速呼叫 T形1::按钮添加单击(TObject(目标) *发件人) {
    字符串 标题 = “标题”;
    字符串 提示[1];
    提示[0] = “提示0”;
    字符串 默认值[1];
    默认值[0] = “默认值0”;
    _di_输入关闭查询过程 遇见 = 新的 输入查询方法(&OnInputQuery_Close(输入查询关闭));
    TDialogServices异步::InputQuery(输入查询)(
        “标题”, 提示, 0, 默认值, 0, (TInput关闭查询过程 *)遇见);
}
空隙 __快速呼叫 T形1::OnInputQuery_Close(输入查询关闭)(常数 系统::Ui类型::TModal结果 A结果,
        系统::Unicode字符串 常数 *A值, 常数 整数 A值_高) {
    字符串 任务名称;
    任务名称 = "";
    如果 (A结果 != mrOk先生)
        返回;
    任务名称 = A值[0];
    尝试 {
        如果 (任务名称.修剪() != "")
            SQLQuery插入->参数按名称(“商店”)->作为字符串 = 任务名称;
        SQLQuery插入->执行SQL();
        项目表->刷新();
        将填充控件链接到字段1->绑定列表->FillList(填充列表)();
        如果 (列表框1->挑选出来的 != 无效的)
            按钮删除->可见 = 真的;
        其他的
            按钮删除->可见 = False(错误);
    }
    抓住 (例外& 前任) {
        显示消息(“错误:” + 前任.消息);
    }
}

这个InputQuery(输入查询)函数显示一个对话框,要求最终用户输入文本。此函数返回真的当用户选择好 啊,以便只有在用户选择时才能向数据库添加数据好 啊文本中包含一些数据。

网间网操作系统 安卓

使用InputQueryOniOS。PNG格式

输入项目Android.png

为删除按钮创建事件处理程序以从列表中删除条目

下一步是向该应用程序添加功能,以从购物列表中删除项目:

  1. 删除一个TSQLQuery(TSQL查询)组件添加到表单中。
  2. 在中设置以下属性对象检查器:
    • 设置姓名属性到SQLQuery删除.
    • 设置SQL连接属性到购物英语连接.
    • 按如下所示设置SQL属性:
      从项目中删除,其中ShopItem=:ShopItem
    • 选择展开上的(…)按钮参数属性。
    • 选择商店商品参数和设置数据类型ftString(英尺字符串).
  3. 在结构视图中,选择按钮删除组件。将以下代码添加到此事件处理程序。

德尔福:

程序 T形1.按钮删除单击(发件人: TObject(目标));
无功功率,无功功率
  任务名称: 字符串;
开始
  任务名称 := 列表框1.挑选出来的.文本;

  尝试
    SQLQuery删除.参数按名称(“商店商品”).作为字符串 := 任务名称;
    SQLQuery删除.执行SQL();
    项目表.刷新;
    将填充控件链接到字段1.绑定列表.FillList(填充列表);
    如果 列表框1.挑选出来的 <>  然后
      按钮删除.可见 := 真的
    其他的
      按钮删除.可见 := False(错误);
  除了
     e(电子): 例外 
    开始
      SHow消息(e(电子).消息);
    结束;
  结束;
结束;

C++生成器:

空隙 __快速呼叫 T形1::按钮删除单击(TObject(目标) *发件人) {
        字符串 任务名称 = 列表框1->挑选出来的->文本;
        尝试 {
                SQLQuery删除->参数按名称(“商店”)->作为字符串 = 任务名称;
                SQLQuery删除->执行SQL();
                项目表->刷新();
                将填充控件链接到字段1->绑定列表->FillList(填充列表)();
                如果 (列表框1->挑选出来的)
                        按钮删除->可见 = 真的;
                其他的
                        按钮删除->可见 = False(错误);
        }
        抓住 (例外 &e(电子)) {
                显示消息(e(电子).消息);
        }
}

为移动平台设置数据库部署

到目前为止,您已经在桌面上使用了SQLite。这意味着实际的数据库位于本地硬盘上(例如C:\Users\Public\Documents\Embarcadero\Studio\23.0\Samples\Data\shoplist.s3db)。在移动设备上,应用程序是沙盒式的,通常您只能读取和写入位于文件文件夹(适用于iOS设备)和内部的应用程序文件夹下的存储(适用于Android设备)。

要连接到移动设备上的本地数据库,您需要执行以下操作:

  • 将数据库部署到移动设备。
  • 文件文件夹(适用于iOS设备)或内部的存储(适用于Android设备)。

在部署管理器中添加和配置数据库文件

在移动设备上运行应用程序之前,需要为数据库文件(shoplist.s3db)设置部署。

  1. 可以使用以下两种方法之一将数据库添加到项目中:
    • 右键单击中的项目名称项目经理并选择添加…从上下文菜单(或项目>添加到项目)以显示添加到项目对话框。导航到数据库位置C: \Users\Public\Documents\Embarcadero\Studio\23.0\Samples\Data,选择数据库购物清单.s3db然后单击正常开放.
    • 导航到数据库位置C: \Users\Public\Documents\Embarcadero\Studio\23.0\Samples\Data并拖放数据库购物清单.s3db项目经理中的项目。单击是的以确认是否要将文件添加到项目中。
  2. 添加数据库文件后特色文件窗口显示,单击取消关闭它。
  3. 打开部署管理器通过选择项目>部署.
  4. 选择调试配置-iOS设备-64位平台调试配置-Android平台从部署管理器顶部的目标平台下拉列表中,查看数据库购物清单.s3db已添加到平台中。
  5. 看看如何远程路径属于购物清单.s3db已为iOS和Android平台设置:
    • 远程路径在iOS设备平台上:启动\文档\
    远程路径OS2.png



    • 远程路径在Android平台上:资产\内部\
    远程路径Android.png

正如您刚才配置的那样,当您在移动设备上运行应用程序时,数据库文件(shoplist.s3db)被设置为部署到文件文件夹(适用于iOS平台)或内部的存储(用于Android平台)在多设备应用程序的沙盒区域中。

修改代码以连接到移动平台上的本地数据库文件

此应用程序的基本功能现已实现。在数据浏览器中工作时,您在Windows上创建了一个数据库文件。数据库文件在移动设备上不可用,除非您将其复制到移动设备或动态创建它。

您可以通过以下步骤创建SQLite数据库和表:

指定SQLite数据库在移动设备上的位置

  1. 在表单设计器中,选择购物英语连接组件。
  2. 对象检查器,双击连接之前事件。
  3. 将以下代码添加到此事件处理程序:

德尔福:

程序 T形1.连接前的购物链接(发件人: TObject(目标));
开始
  {$IF定义(iOS)或定义(ANDROID)}
  购物英语连接.参数.['支持的列元数据'] := “假”;
  购物英语连接.参数.['数据库'] :=
      T路径.联合收割机(T路径.获取文档路径, '购物清单.s3db');
  {$ENDIF}
结束;

这个T路径记录在中声明系统。IO实用程序单位,所以您需要添加系统。IO实用程序在你单位的uses子句中。

C++生成器:

空隙 __快速呼叫 T形1::连接前的购物链接(TObject(目标) *发件人) {
#如果定义了(_PLAT_IOS)||定义了(-PLAT_ANDROID)
        购物英语连接->参数->[“支持的列元数据”] = “错误”;
        购物英语连接->参数->[“数据库”] = 系统::Ioutils公司::T路径::联合收割机(系统::Ioutils公司::T路径::获取文档路径(), “购物清单.s3db”);
#结尾
}

这个T路径记录在中声明系统。IO实用程序库,因此您需要添加#包括<系统。IOUtils.hpp>在您的收割台上。

如果不存在表,则创建表

使用SQLite,可以在不存在表时创建表,方法是使用如果不存在,则创建表格声明。您可以在TSQLConnection组件连接到数据库之后和TSQLDataSet组件连接到表之前创建表。使用以下步骤:

  1. 在表单设计器中,选择购物英语连接组件。
  2. 对象检查器,双击AfterConnect(连接后)事件。
  3. 将以下代码添加到此事件处理程序:

德尔福:

程序 T形1.连接后购物链接(发件人: TObject(目标));
开始
  购物英语连接.执行直接('如果不存在项,则创建表(ShopItem文本不为NULL)');
结束;

C++生成器:

空隙 __快速呼叫 T形1::连接后购物链接(TObject(目标) *发件人){
        购物英语连接->执行直接(“如果不存在项,则创建表格(ShopItem文本不为空)”);
}

在移动设备上运行应用程序

现在,您的应用程序可以在模拟器或连接的移动设备上运行了。
运行应用程序

  1. “项目”窗口,选择您的目标平台。
    目标.png
  2. 选择以下命令之一:
    • 运行>运行
    • 运行>不调试运行


网间网操作系统 安卓

IOS屏幕.png

Android屏幕.png


注:如果在运行应用程序时遇到问题,请按照中给出的步骤进行操作故障排除.

另请参见