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

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

Имею базу данных SQLite3, которая в настоящее время насчитывает около тысячи записей.

Я пытаюсьреализовать функцию, в которой пользователь может пройти по базе данных с помощью кнопок Next / Previous, отредактировать запись, если он пожелает, затем перейти к следующей записи.

Когда я обновляю одну из записей, действует текущая загруженная таблицакак снимок, т. е. таблица показывает старые данные, пока я не перезапущу запрос 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;

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

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

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

0 голосов
/ 09 сентября 2011

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

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

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

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

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

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