Avatar billede Godfather75 Nybegynder
11. september 2013 - 21:38 Der er 6 kommentarer

Min INSERT er for langsom i SQLite?

Jeg arbejder med en applikation til IPhone, Som jeg laver i Delphi XE4. Har problemer med at min INSERT er for langsom og fryser min Gui i de 5 sekunder den er i gang? Jeg laver min Sqlite i en datamodule. Henter data(Json) fra en server til min sqlite. 
Her er min Kode:

  procedure TDataModule4.InsertFromServer(req: string);

    var
      LJsonObj: TJSONArray;
      LIDs: TJSONValue;
      LJPair: TJSONPair;
      LFirst, LTask, LPersonId, LLast: string;
      //q: TSQLQuery;
      // startTime, endTime, elapsedTime: TDateTime;
    begin
      // startTime := Now();
      // SQLConnection1.ExecuteDirect('DROP TABLE IF EXISTS Task');

      SQLConnection1.ExecuteDirect
        ('CREATE TABLE IF NOT EXISTS Task( First TEXT UNIQUE PRIMARY KEY, Last TEXT, Task TEXT, PersonID TEXT)');

      LJsonObj := TJSONObject.ParseJSONValue(req) as TJSONArray;
      SQLConnection1.ExecuteDirect('BEGIN TRANSACTION');

      try
        for LIDs in LJsonObj do
        begin
          for LJPair in TJSONObject(LIDs) do
          begin
            if (LJPair.JsonString.Value = 'PersonID') then
              LPersonId := LJPair.JsonValue.Value;

            if (LJPair.JsonString.Value = 'First') then
              LFirst := LJPair.JsonValue.Value;

            if (LJPair.JsonString.Value = 'Last') then
              LLast := LJPair.JsonValue.Value;

            if (LJPair.JsonString.Value = 'Task') then
              LTask := LJPair.JsonValue.Value;

          end;

          SQLQueryINSERT.Params.ParamByName('First').AsString := LFirst;
          SQLQueryINSERT.Params.ParamByName('Last').AsString := LLast;
          SQLQueryINSERT.Params.ParamByName('Task').AsString := LTask;
          SQLQueryINSERT.Params.ParamByName('PersonID').AsString := LPersonId;
          SQLQueryINSERT.ExecSQL();

        end;
        SQLConnection1.ExecuteDirect('END TRANSACTION');

        SelectResults;
        // endTime := Now();
        // elapsedTime := endTime - startTime;
        // ShowMessage(TimeToStr(elapsedTime));

      finally

        LJsonObj.Free;
      end;
    end;

Min QueryInsert er: INSERT OR IGNORE INTO Task(First,last,Task,PersonID)VALUES(:First,:Last,:Task,:PersonID)

Et spørgsmål mere: Kan man lave en INSERT og UPDATE i en statement?
Avatar billede moddi100 Seniormester
12. september 2013 - 00:26 #1
Nu kender jeg ikke lige til iPhone programmering, men du må da have mulighed for at oprette en ny thread/worker eller lign. som kan udføre handlingen for dig parallelt med at du viser brugeren formen.

Det har som sådan ikke noget med hastigheden for din SQL-forespørgsel at gøre. Det tager jo tid at oprette forbindelse til serveren, udføre forespørgslen og vente på svar. Alt efter netværksdækning kan tiden jo så variere meget. Derfor bør du lave det i en separat tråd og vente på output fra den. På den måde kan din app stadigvæk modtage input omend du må begrænse, hvad der kan gøres imens du venter på svar.
Avatar billede Godfather75 Nybegynder
12. september 2013 - 10:29 #2
Jo du har ret med background worker, men min mentor ønsker ikke at jeg skal bruge threading i en IPhone.. Er der andre muligheder? udfra min kode.
Avatar billede Godfather75 Nybegynder
12. september 2013 - 10:30 #3
Fandt en løsning til mit problem med INSERT/UPDATE Statement:-)
Avatar billede moddi100 Seniormester
12. september 2013 - 10:41 #4
Godt du fik det til at virke, omend jeg nu synes det lyder lidt mystisk at du ikke må anvende en sådan tilgang. Men igen så kender jeg ikke rigtigt noget til iPhone platformen.
Avatar billede hrc Mester
03. oktober 2013 - 10:32 #5
Det er god tone på fora, at når man selv finder en løsning, beskriver man den også. Satte du scriptet til async?
Avatar billede Godfather75 Nybegynder
07. juli 2014 - 22:22 #6
Brug af COMMIT i alle mine transaktioner og min Gui fryser ikke mere.

try
q.SQLConnection := Connection;
DBXTransaction := Connection.BeginTransaction(TDBXIsolations.ReadCommitted);
q.sql query......
end;
  Connection.CommitFreeAndNil(DBXTransaction);
  except
  Connection.RollbackFreeAndNil(DBXTransaction);
  raise
end;
  finally
  q.Free;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester