Как просмотреть обновленную информацию в записи SQLite3 после обновления без повторного запуска запроса?

Я использую Delphi 2010 с оболочкой Тима Андерсона для SQLite (версия Unicode)

Иметь базу данных 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;

Есть ли способ обновить текущую загруженную таблицу? Или мне нужно повторно запустить исходный запрос и вернуться к текущей используемой записи?


person TheSteven    schedule 08.09.2011    source источник
comment
Согласно предоставленной вами ссылке, TSqliteTable представляет собой отключенный набор результатов, не поддерживающий связь с базой данных. Единственным вариантом может быть изменение данных в памяти, если повторный запрос нежелателен, если это вообще возможно...   -  person Sertac Akyuz    schedule 09.09.2011
comment
TSqliteTable представляет набор результатов. Он не поддерживает связь с исходной базой данных. Пропустил это. Данг. Я могу обойти это, используя TSQLiteTable для создания таблицы ID# и используя TSQLiteUniTable для отображения/редактирования данных (предполагается, что TSQLiteUniTable работает быстро, но я не могу использовать его для навигации, потому что вы можете двигаться вперед только через набор рекордов). Я надеялся на менее хитрое решение, но это настольное приложение, и оно должно быть достаточно быстрым.   -  person TheSteven    schedule 09.09.2011


Ответы (2)


Я вижу две возможности, которые не относятся к SQLite (вы всегда должны стараться не привязываться к одному движку базы данных):

  1. Добавьте модификацию TimeStamp к каждой записи, не забудьте создать для нее индекс и сделать запрос на выборку строк только после последнего полученного времени. Запустите его по таймеру. Это будет быстро и легко. Гораздо быстрее, чем извлечение всего содержимого таблицы.

  2. Другая вариация. Вы можете добавить триггер в SQLite, а затем вставить обновленную запись в отдельную таблицу. Тогда вам нужно будет получить только эту небольшую внешнюю таблицу. Но вам придется поддерживать одну таблицу для каждого клиента.

Так что думаю вариант №1 самый простой.

Например, в последняя версия нашей ORM (которая основана на SQLite3, но не ограничивается), у вас есть два способа обновления пользовательского интерфейса:

  • По глобальному протоколу без сохранения состояния и кэшированию на стороне сервера (специальным методом);
  • С помощью нового TModTime опубликованного свойства, которое будет обновляться при любом обновлении RESTful базы данных, чтобы легко реализовать вариант №1.
person Arnaud Bouchez    schedule 09.09.2011

Я работал над этим, используя TSQLiteTable для создания массива ID# и используя TSQLiteUniTable для отображения или редактирования данных на основе ID# записи. Очень просто и более чем достаточно быстро для количества записей, с которыми будет иметь дело это приложение.

person TheSteven    schedule 04.11.2011