如何在更新后不运行查询的情况下查看SQLite3记录中的更新信息



我使用Delphi 2010与Tim Anderson的SQLite包装器(unicode版本)

有一个SQLite3数据库,目前大约有1000条记录。

我正在尝试实现一个功能,用户可以通过使用下一个/上一个按钮走过数据库,编辑记录,如果他们想,然后移动到下一个记录。

当我更新其中一条记录时,当前加载的表就像快照一样,即表显示旧数据,直到我重新运行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;

是否有刷新当前加载表的方法?或者我必须重新运行原始查询并返回到当前使用的记录?

我看到了两种可能性-它们不是SQLite特定的(您应该始终尝试不要绑定到一个数据库引擎):

  1. 为每条记录添加一个修改时间戳,不要忘记在其上创建索引,并进行查询,仅在最近检索时间之后获取行。在计时器中运行它。这将是快速和容易的。

  2. 另一个变化。您可以在SQLite中添加一个触发器,然后将更新后的记录插入到一个单独的表中。那么你只需要拿一张外部的小桌子。但是您必须为每个客户端维护一个表。

所以我想选项# 1是最简单的。

例如,在最新版本的ORM(基于SQLite3,但不限于此)中,您有两种UI刷新方式:

  • 通过全局无状态协议和服务器端缓存(使用专用方法);
  • 通过一个新的TModTime发布属性,该属性将在数据库的任何RESTful更新上更新,以轻松实现选项# 1。

我使用TSQLiteTable来创建一个ID#的数组,并使用TSQLiteTable来显示或编辑基于记录ID#的数据。非常简单,对于这个应用程序将处理的记录数量来说足够快。

最新更新