Jump to content

[TUTORIAL - RO] Sqlite connect/create/insert...etc


FlorinSzasz

Recommended Posts

Salut tuturor! M-am decis de ceva vreme sa realizez un tutorial legat de mysql mai exact ,,sqlite,, din motivul
ca am tot primit intrebari legate de topicul asta. Asa ca voi incerca in mare sa acopar cam ce trebuie sa avem in vedere.
Am sa ofer exemple concrete astfel incat sa fie totul clar si limpede si pe intelesul tuturor!

--Avem functiile: 

dbConnect()
dbExec()
dbQuery()
dbFree()
dbPoll()

1). dbConnect()

--1.Folosim dbConnect() - pentru a crea sau a ne conecta la o baza de date existenta.
--Exemplu 
dbConnect("sqlite","data.db")  
-- primul parametru sqlite indica tipul bazei de date 
--iar al doilea indica numele care poate fi orice doriti cat timp este cu extensia / terminatia ".db"

2. dbExec() se foloseste

a) cand cream un tabel in baza de date!
b) cand facem update la datele care sunt  deja prezente in baza de date!
c) cand inseram ceva in baza de date!

Exemple:

--- !!! se are in vedere in primul camp al functiei dbExec avem mereu variabila ce are legatura cu conexiunea la baza de date adica variabila connection!
	dbExec(connection,"CREATE TABLE IF NOT EXISTS PlayerData (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,name TEXT,hp INTEGER,money INTEGER,armour INTEGER,skin INTEGER,location TEXT)")
	-->a) cream tabelul PlayerData daca acesta nu exista deja, asta indica expresia pana la inceperea parantezei!
	-->b) primul camp este id numar intreg si nenul adica trebuie sa aiba o valoare, mai mult decat atat este cheie primara ceea 
	-- ce inseama ca acest numar sau valoare nu poate fi dublata este unica, 
	-- autoincrement inseamna ca valoarea acestui camp creste cu fiecare inserare
	-->c) campul nume este de tip Text deoarece numele contului pe care jucatorul joaca este un string
	-->d) hp este de tip numar intreg deoarece reprezinta viata jucatorului
	-->e) armour este de tip numar intreg deoarece reprezinta armura jucatorului
	-->f) skin   este de tip numar intreg deoarece reprezinta modelul jucatorului
	-->g) money  este de tip numar intreg deoarece reprezinta valoarea banilor pe care jucatorul ai detine
	-->h) location este de tip text deoarece vom folosi  functia toJSON pentru pune toate valorile intr-un string. 
 	--Fara a mai crea 3 campuri in tabelul PlayerData
	-- >> dupa denumirea campului in expresia prin care creeam tabelul trecem si tipul acestuia de exemplu name este un camp text 
--pentru ca numele jucatorului este un text si nu un numar intreg
---------------------------------------------------------------------------------------------
dbExec(connection,"INSERT INTO PlayerData (name,hp,money,armour,skin,location) VALUES (?,?,?,?,?,?)",name,hp,money,armour,skin,location)
	-- inseram in tabelul PlayerData
	-- in functie de campurile in care inseram le trecem intre paranteze
	-- daca vreau sa inserez doar in campul name trec doar name intre paranteze si la VALUES (?) un singur semn de intrebare in paranteze 
	-- cate campuri avem intre paranteze atatea semne de intrebare punem la VALUES intre paranteze
	-- dupa adaugam valorile aferente campurilor pe care le avem in paranteze
	-- numarul valorilor trebuie sa fie egale cu cel al campurilor si al semnelor de intrebare din paranteze.
---------------------------------
dbExec(connection,"UPDATE PlayerData set hp=?,money=?,armour=?,skin=?,location=? WHERE name=?",hp,money,armour,skin,location,name)
	-- aici facem update la tabelul PlayerData
	-- in functie de numarul campurilor la care facem update atatea valori adaugam dupa expresia ce este intre ghilimele 
-- la aceste valori se adauga ultima valoarea/variabila ce cuprinde numele contului de pe care jucatorul se joaca pe server 
	-- daca doar la hp vrem sa facem update avem -> dbExec(connection,"UPDATE PlayerData set hp=? WHERE name=?",hp,name)

3.) dbQuery() -->  Folosim functia -> cand interogam baza de date pentru anumite informatii care sunt / sau pot fi prezente in aceasta!

--> selectam date din baza de date 
	dbQuery(connection,"SELECT * FROM PlayerData") -- selectam tot din tabela PlayerData, la primul argument avem 	
	--> ca si la dbExec() variabila aferenta conexiunii
	dbQuery(connection,"SELECT * FROM PlayerData WHERE name=?",name) -- selectam tot din tabel unde avem numele jucatorului selectat.
	dbQuery(connection,"SELECT hp FROM PlayerData WHERE name=?",name) -- selectam doar datele legate de hp unde avem numele jucatorului selectat.

4. dbFree() - il folosim doar pentru a elibera baza de date de interogarea care nu ofera un rezultat sau care ofera un rezultat dar nu este colectat sau folosit!

5. Folosim dbPoll() - pentru a verifica daca baza de date a pregatit / returnat un rezultat in urma unei interogari!

dbPoll(query,-1) -- aceasta functie  va returna un tabel cu rezultatele cerute de la baza de date daca datele cautate sunt in baza de date.
--query reprezinta interogarea la care face referire.

6.Exemplu Practic in script:

local connection = dbConnect("sqlite","data.db") -- cream / ne conectam la baza de date

if connection then  -- verificam daca conectarea reuseste
    outputDebugString("[DB] avem conexiune la baza de date [data]") -- acest mesaj apare in consola serverului daca conectarea are loc
else
    outputDebugString("[DB] nu avem conexiune la baza de date [data]")  -- acest mesaj apare in consola serverului daca conectarea nu are loc
end 

function createTable() -- cream tabelul bazei de date
    dbExec(connection,"CREATE TABLE IF NOT EXISTS PlayerData (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,name TEXT,hp INTEGER,money INTEGER,armour INTEGER,skin INTEGER,location TEXT)")
end 
addEventHandler("onResourceStart",getRootElement(),createTable)

function loginData(_,contPrezent) -- contPrezent este contul cu care jucatorul se conecteaza
    local NumeCont = getAccountName(contPrezent) -- obtinem numele contului pe care jucatorul il foloseste acesta poate sa fie asemanator cu numele din joc al jucatorului sa nu
    if NumeCont then -- daca avem numele contului mergem mai departe
        local query = dbQuery(connection,"SELECT * FROM PlayerData WHERE name=? LIMIT 1",NumeCont) -- interogam baza de date cu numele primit
    -- limit 1 limiteaza numarul de rezultate la 1 daca avem mai multe!
        local rezultat = dbPoll(query,-1) -- colectam rezultatul din tabelul PlayerData
        if #rezultat > 0 then  -- daca avem rezultat continuam
            for k,v in ipairs(rezultat) do -- trecem prin sir si setam jucatorului datele salvate
            setElementHealth(source,v.hp)
            setPedArmor(source,v.armour)
            setPlayerMoney(source,v.money)
            setElementModel(source,v.skin)
            local location = fromJSON(v.location) -- folosim fromJSON() pentru ca datele au fost salvate sub forma de de string si vrem sa le aducem sub forma de sir
            setElementPosition(source,location[1],location[2],location[3])
            end 
            elseif #rezultat == 0 then -- daca rezultatul este zero inseram jucatorul in baza de date pe baza numelui de cont al acestuia
            dbExec(connection,"INSERT INTO PlayerData (name) VALUES (?)",NumeCont)
        end 
    end 
end 
addEventHandler("onPlayerLogin",getRootElement(),loginData)

function leaveData()
        local location = {} -- sirul gol in care punem locatia jucatorului
        local Nume = getAccountName(getPlayerAccount(source)) -- cautam numele de cont al jucatorului care iese de pe server
        local hp = getElementHealth(source) -- aflam Hp-ul acestuia
        local money = getPlayerMoney(source) -- aflam banii
        location[1],location[2],location[3] = getElementPosition(source) -- aflam locatia si o punem intr-un sir
        local skin = getElementModel(source) -- aflam modelul skin-ului folosit
        local armour = getPedArmor(source) -- aflam armura jucatorului
	-- facem update la baza de date si mai exact la ce am aflat adica hp, banii, skin,armura, si locatie, dupa care avem Nume deoarece specificam bazei de date la ce jucator sa faca update
    dbExec(connection,"UPDATE PlayerData SET hp=?,money=?,armour=?,skin=?,location=? WHERE name=?",hp,money,armour,skin,toJSON(location),Nume)
  	-- am folosit toJSON() pentru a stoca sirul cu coordonatele jucatorului ca si string pentru ca acesta sa fie salvat in campul location din baza de date sub forma de text
end 
addEventHandler("onPlayerQuit",getRootElement(),leaveData)

 

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...