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

Използвам Delphi 2010 с обвивката на SQLite на Тим Андерсън (уникод версия)

Имате база данни 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;

Има ли начин да обновя текущо заредената таблица? Или трябва да изпълня отново оригиналната заявка и да се върна обратно към текущия използван запис?


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. Добавете времеви печат на модификация към всеки запис, не забравяйте да създадете индекс върху него и направете заявка за извличане на редове само след последното извлечено време. Пуснете го в таймер. Това ще стане бързо и лесно. Много по-бързо от извличането на цялото съдържание на таблицата.

  2. Друга вариация. Можете да добавите тригер в SQLite, след което да вмъкнете актуализирания запис в отделна таблица. Тогава ще трябва да вземете само тази малка външна маса. Но ще трябва да поддържате една маса на клиент.

Така че предполагам, че вариант №1 е най-лесният.

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

person Arnaud Bouchez    schedule 09.09.2011

Заобиколих го, като използвах TSQLiteTable, за да създам масив от ID# и използвах TSQLiteUniTable, за да покажа или редактирам данните въз основа на ID# на записа. Много просто и повече от достатъчно бързо за брой записи, с които ще се справи това приложение.

person TheSteven    schedule 04.11.2011