C++ Builder10.2 for Android操作sqlite数据库的简单实现

         C++ Builder10.2 for Android操作sqlite数据库的简单实现
     系统联机帮助中有开发IOS和Android应用通过TFDQuery和SQL语句操作sqlite的详细步骤,本文则是利用TFDTable控件实现数据库操作的另一种基本类似的方法。
     1. 在官网上下载安装sqlite3软件,创建一个数据库test.db,在库中建立几个数据表,如mytable1等。注意,浮点数选择Double类型,不要选择numeric类型,后者是BCD类型,在网格控件上显示为(BCD),以前版本能正确显示数字。
     2. 与系统联机帮助一致,在C++ builder上新建一个空白Android应用,将第一步建立的库test.db拷入该应用所在目录下。
     3. 增加控件: FDPhysSQLiteDriverLink1、FDGUIxWaitCursor1、FDConnection1、FDTable1、Grid1。
     4. 连接SQLite数据库:
双击FDConnection1->Definition->Driver ID=SQLite;
下方的Database设置一下数据库test.db的路径;
FDTable1->tablename-=mytable1
     5. 绑定数据:
①菜单->View->LiveBindings Designer->点击绑定向导(就是最左下方的按钮)。
②LiveBindings Wizard->LInk a grid with a data source->Next。
③LiveBindings Wizard->Grid1->Next。
④LiveBindings Wizard->FDTable1->Next->Finish。
     6. 发布:
菜单Project->Deployment->Add File->选择文件test.db;
Remote Path->assets\internal\。
     7. 程序中增加事件处理代码:
FDConnection1BeforeConnect事件增加代码:
FDConnection1.Params.Values['Database']:=TPath.Combine(TPath.GetDocumentsPath,'test.db');

     注意,中文存储乱码问题,上述建立的数据库test.db是UTF8编码格式,理论上存入的数据要用UTF8Encode()转换为该编码,直接存入中文是乱码。如果数据来自GB2312时,目前我没有找到有效的转换方法,但发现强制存入GB2312也可以,示例代码如下:

     typedef AnsiString_T<936> GB2312String;
     GB2312String  myGstr = myPtr1[0];  //myPtr1[0]为来自网络中的GB2312编码中文字符串
     FDTable1Name->AsString = myGstr;
    效果如下图所示:
      

     示例中没有用系统自带的数据库导航栏,自定义按钮进行导航也很简单,如增加新记录:FDTable1->Append();
提交修改:FDTable1->CheckBrowseMode(),等等。
   删除记录前需要出现确认对话框,而Android系统不支持阻塞式对话框,因而不能直接使用Messagedlg(),需要用到回调函数,详细方法参见 http://blog.csdn.net/realbay/article/details/43268031。本示例中,删除记录事件代码如下:

void __fastcall TForm1::DeleteButtonClick(TObject *Sender)
{
_di_TInputCloseDialogProc ADialogProc = new TMyDialogProc(this); //该行要放入form()中,变量声明放入头文件,即只new一次!
MessageDlg(L"真要删除该记录吗?",
  TMsgDlgType::mtInformation,
  TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbCancel,
  0, ADialogProc);
}
其中TMyDialogProc类代码如下:
class TMyDialogProc : public TCppInterfacedObject< TInputCloseDialogProc >
{
private:
 TForm *myDlgForm;
public:
 __fastcall TMyDialogProc(TForm *Form0) : myDlgForm(Form0){}
    void __fastcall Invoke(const System::Uitypes::TModalResult AResult)
    {
        if(AResult == mrYes)
        {
   Form1->FDTable1->Delete();
        }
    }
};

本文顺便记录下上面链接文中InputBox()用法的示例代码如下:
  1. //---------------------------------------------------------------------------  
  2. class TMyDialogProc3 : public TCppInterfacedObject< TInputCloseBoxProc>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值