我正在使用带有Tim Anderson's SQLite wrapper (unicode version)
的Delphi 2010拥有一个目前大约有一千条记录的SQLite3数据库。
我正在尝试实现一个功能,用户可以使用“下一个/上一个”按钮遍历数据库,如果需要则编辑记录,然后转到下一条记录。
当我更新其中一条记录时,当前加载的表的行为类似于快照,即该表显示旧数据,直到我重新运行SQL查询以重新加载表。
以下是执行更新的Delphi代码。
procedure TForm1.btnUpdateClick(Sender: TObject);
var
slDBpath: string;
sldb: TSQLiteDatabase;
sSQL: String;
ts: TStringStream;
begin
slDBpath := ExtractFilepath(application.exename) + 'test.db';
sldb := TSQLiteDatabase.Create(slDBpath);
try
ts := TStringStream.Create(memNotes.Text, TEncoding.UTF8);
try
sldb.BeginTransaction;
sSQL := 'UPDATE testtable SET Name = "' + ebName.Text + '", Number = ' + ebNumber.Text + ' WHERE ID = '+ ebID.text +';';
sldb.execsql(sSQL);
sldb.Commit;
finally
ts.Free;
end;
finally
sldb.Free;
end;
end;
有没有办法刷新当前加载的表? 或者我是否必须重新运行原始查询并返回当前使用的记录?
答案 0 :(得分:0)
我看到两种可能性 - 它们不是特定于SQLite的(您应该总是尽量不要绑定到一个数据库引擎):
向每条记录添加修改TimeStamp,不要忘记在其上创建索引,并在最近检索的时间之后进行查询以获取行。在计时器中运行它。这将是快速和简单的。比检索整个表格内容快得多。
另一种变化。您可以在SQLite中添加触发器,然后将更新的记录插入到单独的表中。然后你将只需要获取这个小外部表。但是你必须为每个客户维护一个表。
所以我认为选项#1是最简单的。
例如,在latest version of our ORM(基于SQLite3但not restricted to)中,您有两种UI刷新方式:
TModTime
已发布的属性(数据库will be updated on any RESTful update)轻松实现选项#1。答案 1 :(得分:0)
我通过使用TSQLiteTable创建ID#数组并使用TSQLiteUniTable根据记录的ID#显示或编辑数据。这个应用程序将处理的记录数量非常简单且速度非常快。