工作中遇到了用delphi查询sqlite数据库并将查询结果在listview展示的问题,而sqlite并不原生支持delphi,在网上查资料,看到有两篇文章都是引用以下一位delphi牛人对sqlite的封装,附上链接:https://www.itwriting.com/blog/articles/a-simple-delphi-wrapper-for-sqlite-3 我觉得作者这个简洁明了,有demo,能满足自己的需求。
作者也提到是用了很多别人封装的东西之后发现有bug,而且也没有把查询结果绑定到TDataSet的需求,所以干脆自己做了一份。我就直接在demo的基础上拿来用了。以下是查询sqlite并展示在listview上的代码。
procedure TForm1.btnReadClick(Sender: TObject);
var
slDBpath: string;
sldb: TSQLiteDatabase;
sltb: TSQLIteTable;
i: Integer;
begin
lv.Items.Clear; //lv为TListView控件,列标题可以提前在控件中编辑好
slDBpath := ExtractFilepath(application.exename) + 'db1.db3'; //数据库文件在程序根目录
sldb := TSQLiteDatabase.Create(slDBpath);
try
sltb := sldb.GetTable('SELECT * FROM log');
try
if sltb.Count > 0 then
begin
for i := 0 to sltb.Count - 1 do
begin
with lv.Items.Add do //新建一行,然后给每行的各个列赋值
begin
Caption := sltb.FieldByName['id'];
SubItems.add(sltb.FieldByName['billid']);
SubItems.add(sltb.FieldByName['cardid']);
SubItems.add(UTF8Decode(sltb.FieldByName['name']));
SubItems.add(sltb.FieldByName['amount']);
SubItems.add(sltb.FieldByName['result']);
SubItems.add(sltb.FieldByName['orderid']);
SubItems.add(sltb.FieldByName['remark']);
SubItems.add(sltb.FieldByName['curdate']);
SubItems.add(sltb.FieldByName['resdate']);
end;
sltb.next; //继续下一行
end;
end;
finally
sltb.Free;
end;
finally
sldb.Free;
end;
end;
TListView因为之前也没用过,踩了一个坑,有个属性ViewStyle默认是vsIcon,这个时候SubItems赋的值是不显示的,选成vsReport就可以了,因为这个问题查了一下午,我一度以为是ide的bug。
以上操作需要使用到SQLite3.pas、SQLiteTable3.pas两个pas文件和sqlite3.dll三个文件,在作者的demo里有,可以自行下载。也可以在资源链接下载。数据库文件可直接放在程序根目录,方便测试。