时将其声明为AnsiString,所以必须手动进行解码。
最后一点重要提示,当使用完GetTable返回的TSQLiteTable实例之后,需要由调用方调用Free函数进行释放,否则会内存泄露,一定要注意。
例如:
table:=database.GetTable(UTF8Encode(strsql));
try
for i:= 1 to table.Count do
begin
// 对每一行检索信息
New(pinfo);
pinfo^.name:=UTF8Decode(table.FieldAsString(table.FieldIndex['name']));
pinfo^.size:=UTF8Decode(table.FieldByName['size']);
。。。。
// 插入到链表中
infolist.Add(pinfo);
table.Next;
end;
finally
table.Free;
end;
3.断开数据库连接,销毁TSQLiteDatabase实例即可
例如:database.Free;
如果使用原版的sqlitesimpledelphi,当使用UTF8Decode函数之后,可能依然存在乱码问题,一个表现就是,最后一个汉字显示为框,后面跟一个问号,其他的汉字解码正常。
后来跟踪了一下sqlitesimpledelpi的
源代码,从SQLite获取的字符串数据是正确的,但是因为TSQLiteTable的构造函数在读取SQLite返回的UTF8字符串时使用了setstring函数,强行将数据字段进行了转换,引起字符串长度出现错误,所以在UTF8Decode解码时出现了漏解码的问题。
我这里给出一种解决
方案,基本修复了该Bug。
1.将TSQLiteTable的构造函数Create中的setstring行注释掉。将thisStringValue的生命从pstring改为PRawByteString。将临时数据ptrValue直接赋值给thisStringValue。
2.相关函数/属性声明修改如下:
function GetFields(I: cardinal): string; 改为function GetFields(I: cardinal): RawByteString;
function GetFieldByName(FieldName: string): string; 改为function GetFieldByName(FieldName: string): RawByteString;
function FieldAsString(I: cardinal): string;改为function FieldAsString(I: cardinal): RawByteString;
property Fields[I: cardinal]: string read GetFields;改为property Fields[I: cardinal]: RawByte
String read GetFields;
property FieldByName[FieldName: string]: string read GetFieldByName;改为property FieldByName[FieldName: string]: RawByteString read GetFieldByName;
下面提供的是最新的sqlitesimpledelphi原版和修正版。
原版网盘下载1(UUSHARE)
原版网盘下载2(115网盘)
修正版网盘下载1(UUSHARE)
修正版网盘下载2(115网盘)
截几张图上来看看: