zoukankan      html  css  js  c++  java
  • FireDAC 下的 Sqlite [9]


    SQLite 内部是按二进制排序, 可以支持 ANSI; FrieDAC 通过 TFDSQLiteCollation 支持了 Unicode 排序, 并可通过其 OnCompare 事件自定义排序.

    下面的例子, 测试了这两种排序的不同.

    可把下面代码直接贴在空白窗体上, 以快速完成窗体设计:


    代码:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Integer;
      LCode: Integer;
    begin
      {给 FDSQLiteCollation1 设定参数}
      FDSQLiteCollation1.DriverLink := FDPhysSQLiteDriverLink1;
    //  FDSQLiteCollation1.CollationKind := scCompareString; //这是默认值(Unicode 不区分大小写, 在 Win 下是调用 WinAPI.CompareString); 使用其他选项需要自定义排序规则
      FDSQLiteCollation1.LocaleName := 'zh-CN';
      FDSQLiteCollation1.Flags := [sfIgnoreCase];
      FDSQLiteCollation1.CollationName := 'MyCollation';     //下面所有的调用全要依赖这个名称
      FDSQLiteCollation1.Active := True;
    
      FDConnection1.Params.Add('DriverID=SQLite');
    //  FDConnection1.Params.Add('OpenMode=CreateUTF8'); //这是默认值, 可选 CreateUTF16(Unicode)
    
      {建立测试表, 三个字段 str(汉字), code(汉字对应的 Unicode 值), id(添加顺序)}
      FDConnection1.ExecSQL('CREATE TABLE MyTable(str string(10), code integer, id integer)');
    //  FDConnection1.ExecSQL('CREATE TABLE MyTable(str string(10) COLLATE MyCollation, code integer, id integer)'); //用在表设计时
    
      {添加测试数据数据}
      for i := 0 to 99 do
      begin
        LCode := Random($9FA5-$4E00);
        FDConnection1.ExecSQL('INSERT INTO MyTable(str, code, id) VALUES(:1, :2, :3)', [WideChar($4E00 + LCode), LCode, i+1]);
      end;
    
      FDQuery1.Open('SELECT * FROM MyTable'); //无排序
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      FDQuery1.Open('SELECT * FROM MyTable ORDER BY str'); //SQLite 内置排序
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      FDQuery1.Open('SELECT * FROM MyTable ORDER BY str COLLATE MyCollation'); //FireDAC 默认排序
    end;
    


    测试效果图:


  • 相关阅读:
    最佳实践:腾讯HTAP数据库TBase助力某省核心IT架构升级
    数据库中间件
    深入理解JVM—JVM内存模型
    【实战解析】基于HBase的大数据存储在京东的应用场景
    Only the storage referenced by ptr is modified. No other storage locations are accessed by the call.
    京东11.11:京麦服务市场交易平台备战实践
    gitignore 不起作用的解决办法 不再跟踪 让.gitignore生效,跟踪希望被跟踪的文件
    JAVA中的array是通过线性表还是链表实现的呢?
    在链表中,元素的"位序"概念淡化,结点的"位置"概念淡化
    微软开源项目提供企业级可扩展推荐系统最新实践指南
  • 原文地址:https://www.cnblogs.com/del/p/3746725.html
Copyright © 2011-2022 走看看