sqlite speichern und laden Problem

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo Leute
    Ich hab ein kleines Problem wobei ihr mir bestimmt helfen könnt
    ich setze mich grad ein bissel mit sqlite auseinander speichern und laden klappt auch schon ganz gut


    allerdings wenn ich jetzt zb. 8 Fahrzeuge gespeichert habe und ich lösche ingame Fahrzeug 5
    dann wird in der Tabelle natürlich id 5 gelöscht iss auch richtig so
    danach wird aber das letzte Fahrzeug nicht mehr gespeichert da ja eine id mittendrinn fehlt
    wie kann man das umsetzen das sich die nr. der restlichen Fahrzeuge anpassen


    weiß da jemand rat?


    hier das laden und speichern, villeicht haut da ja irgentwas nicht hin
    /////////////////////
    //erstellen
    //Der Teil des dialogs vom erstellen
    new str[512];
    for(new i=1;i<MAX_FRACTION_CARS;i++)
    {
    new Float:fX,Float:fY,Float:fZ,Float:fA;
    GetPlayerPos(playerid,fX,fY,fZ),GetPlayerFacingAngle(playerid,fA);
    if(FractionCars[i][erstellt]==true)continue;
    FractionCars[i][erstellt] = true;
    FractionCars[i][fVehid] = GetPVarInt(playerid,"fVehid");
    FractionCars[i][fPos][0] = fX,
    FractionCars[i][fPos][1] = fY,
    FractionCars[i][fPos][2] = fZ,
    FractionCars[i][fPos][3] = fA,
    FractionCars[i][fCol][0] = GetPVarInt(playerid,"fCol1");
    FractionCars[i][fCol][1] = GetPVarInt(playerid,"fCol2");
    FractionCars[i][fFraction] = GetPVarInt(playerid,"fFraction1");
    FractionCars[i][fHealth] = 1000;
    format(str,sizeof(str),"INSERT INTO `ffcars1` (`ID`,`fPos0`,`fPos1`, `fPos2`,`fPos3`,`fVehid`,`fCol0`,`fCol1`,`fFraction`, `fHealth`, `fBenzin`) VALUES ('%i','%f','%f','%f','%f','%d','%d','%d','%d','%f','100')",
    i,fX,fY,fZ,fA,FractionCars[i][fVehid],FractionCars[i][fCol][0],FractionCars[i][fCol][1],FractionCars[i][fFraction],FractionCars[i][fHealth]);
    db_query(Serverdaten,str);
    FractionCars[i][fCarid] = CreateVehicle(FractionCars[i][fVehid],FractionCars[i][fPos][0],FractionCars[i][fPos][1],FractionCars[i][fPos][2],FractionCars[i][fPos][3],FractionCars[i][fCol][0],FractionCars[i][fCol][1],-255);
    FractionCars[i][fLock] = true;
    return 1;
    }

    ///////////////////////
    //Laden


    forward LoadFractionCars();
    public LoadFractionCars()
    {
    new DBResult:Result,query[256] ,str[256], rows,i=1;
    for(;i<MAX_FRACTION_CARS;i++)
    {
    format(str,sizeof(str),"SELECT * FROM `ffcars1` WHERE `ID` = '%i'",i);
    Result = db_query(Serverdaten,str);
    rows = db_num_rows(Result);
    if(rows != 0)
    {
    db_get_field_assoc(Result,"fVehid",query,sizeof(query)); FractionCars[i][fVehid]=strval(query);
    db_get_field_assoc(Result,"fPos0",query,sizeof(query)); FractionCars[i][fPos][0]=floatstr(query);
    db_get_field_assoc(Result,"fPos1",query,sizeof(query)); FractionCars[i][fPos][1]=floatstr(query);
    db_get_field_assoc(Result,"fPos2",query,sizeof(query)); FractionCars[i][fPos][2]=floatstr(query);
    db_get_field_assoc(Result,"fPos3",query,sizeof(query)); FractionCars[i][fPos][3]=floatstr(query);
    ///////////////////////////////////
    ///Hier die Tuning sachen und der rest

    FractionCars[i][fCarid] = CreateVehicle(FractionCars[i][fVehid],FractionCars[i][fPos][0],FractionCars[i][fPos][1],FractionCars[i][fPos][2],FractionCars[i][fPos][3],FractionCars[i][fCol][0],FractionCars[i][fCol][1],-255);
    FractionCars[i][erstellt] = true;
    FractionCars[i][fLock] = true;
    SetVehicleHealth(FractionCars[i][fCarid],FractionCars[i][fHealth]);
    UpdateVehicleDamageStatus(FractionCars[i][fCarid],FractionCars[i][fDmgPanels],FractionCars[i][fDmgDoors],FractionCars[i][fDmgLights],FractionCars[i][fDmgTires]);


    fraks++;
    }
    db_free_result(Result);
    }printf(" Es wurden %d Fraktions Cars erfolgreich Geladen",fraks);
    fraks=0;
    i=1;
    }


    ////////////////////////////////////////
    //Speichern
    stock UpdateFractionCars()
    {
    new query[256],query1[256];
    new i;while(i<MAX_FRACTION_CARS)
    {
    if(FractionCars[i][fVehid] >= 400 && FractionCars[i][fVehid] <= 611)
    {
    new Float:health;
    GetVehicleHealth(i, health);
    GetVehicleDamageStatus(i,panels,doors,lights,tires);
    format(query,sizeof(query),"UPDATE `ffcars1` SET `fDmgPanels`='%d',`fDmgDoors`='%d',`fDmgLights`='%d',`fDmgTires`='%d',`fHealth`='%f',`fBenzin`='%d' WHERE `ID`='%i'",
    panels,doors,lights,tires,health,FractionCars[i][fBenzin],i);
    //
    // hier werden dann noch die tuning sachen geladen
    //
    db_query(Serverdaten,query);
    }i++;
    }
    }
    edit: Überschrift geändert

    Einmal editiert, zuletzt von Patricbiker ()

  • Um es einfach zu sagen, nein du kannst die anderen ids nicht automatisch anpassen (meines Wissens nach), das einzige was du machen könntest, ist für jedes Fahrzeug eine Variable erstellen wo dann die Datenbank ID eingetragen wird, dann ist es egal ob ids zwischendurch fehlen, da dann die id vorhanden ist und du kannst dann ganz einfach updaten und löschen.


    bspw. beim Laden:



    new dbID[MAX_VEHICLES];


    //beim laden (NACH CreateVehicle)
    db_get_field_assoc(Result,"ID",query,sizeof(query));dbID[FractionCars[i][fCarid]]=strval(query);


    //beim speichern
    format(query,sizeof(query),"UPDATE `ffcars1` SET `fDmgPanels`='%d',WHERE `ID`='%i'",dbID[i]);
    db_query(Serverdaten,query);
    Du müsstest dann halt immer die Fahrzeug ID die es auf dem Server hat haben beim speichern, obwohl ich aus deinem Code das nicht so herauslesen kann, wie du die Fahrzeuge identifiziertes bzw. weißt welches Fahrzeug wo in der Datenbank ist oder ich sehe es einfach nicht. :whistling:

  • Erstmal danke dafür
    habe es ausprobiert und das laden updaten löschen klappt jetzt
    was allerdings nicht mehr klappt ist das erstellen, es wird zwar noch das fahrzeug erstellt aber nicht mehr in die datenbank eingetragen, schnall ich nicht

  • Das gleiche Probleme habe ich auch, bis ich eine Lösung dafür finde habe ich es so gemacht, das die erstellten Sachen erst nach einem Neustart Laden, aber habe gerade etwas gegooglet und ich denke das könnte dir weiterhelfen:


    http://dev.mysql.com/doc/refma…l#function_last-insert-id


    Gibt dir die letzte ID zurück, der kleine Nachteil ist hierbei wenn in der Zwischenzeit noch ein Zweiter Eintrag eingetragen wird, das du dann eine falsche id zurückbekommst, aber ich denke das kann man auch irgendwie lösen.