[Tutorial] SQLite
#1

SQLite
[*] Introducciуn
Buenas, decidн hacer este tutorial para que tengan una referencia a la hora de implementar SQL en vuestro servidor, o para que se planteen si realmente es necesario implementarlo. Menciono que no explicarй cуmo usar el lenguaje SQL, pero sн intentarй hacer una pequeсa guнa para poder hacer operativa nuestra base de datos.

Antes de todo, tenemos que aclarar algunas dudas a las personas que no saben nada sobre las bases de datos y el SQL.


[*] їDe quй estamos hablando?
Seguramente mбs de uno tendrб en su carpeta scriptfiles decenas de archivos en donde se guardan datos relativos a los usuarios, a los sistemas de casas de vuestro servidor, o de los coches, de lo que sea. Imaginaros un servidor con mil usuarios, tendrнamos mil archivos independientes, y manipularlos uno por uno se convertirнa en una tarea muy pesada.

Podrнamos evitarnos todo esto usando una base de datos, un solo archivo para todo nuestro servidor, y actuarнamos con el rбpidamente mediante ciertas instrucciones que le mandamos a travйs del lenguaje SQL.


[*] Diferencias entre SQLite y MySQL
Seguramente habrбn oнdo hablar del famoso MySQL, pues bien, MySQL es un sistema de gestiуn de bases de datos. La caracterнstica principal de este sistema es que es independiente a la aplicaciуn que requiere de йl, esto significa que se requiere una conexiуn remota entre la aplicaciуn y la base de datos.

En cambio, SQLite es un sistema que viene incluido en el SA-MP desde la versiуn 0.2.2 de йste, es una base de datos local y se almacena en el mismo host que el SA-MP Server. Debido a lo anterior, usar una base de datos mediante SQLite se convierte en algo mucho mбs sencillo que usar MySQL ya que no ha de haber ninguna conexiуn a travйs de la red de por medio.

La base de datos SQLite se almacena en el propio scriptfiles, el MySQL podrнa estar en el mismo host que el servidor SA-MP, pero aun asн tendrнamos que establecer una conexiуn a travйs de la red.


[*] їCuбndo usar cada cual?
Lo cierto es que existen mбs sistemas de gestiуn de bases de datos pero el MySQL es uno de lo mбs conocidos debido a su sencillez, se puede usar en una infinidad de cosas ajenas al SA-MP, como en una red social, en una empresa que guarda ciertos datos, etc.

El php estб muy preparado para trabajar con el MySQL, igual que el SA-MP con el SQLite. El SQLite en el caso del SA-MP tiene una cantidad de funciones que son propias del SA-MP, es decir, conectar una pбgina web a una base de datos SQLite creada por SA-MP serнa algo muy complicado. Por esto, es preferible usar MySQL si vas a diseсar una pбgina web que actъa con el servidor y los datos de йste ya que con el php todo serб muy sencillo. En este caso la base de datos serб algo independiente al SA-MP y a la pбgina web, pero cada aplicaciуn accede a ella mediante una conexiуn independiente y ejecuta lo que dictemos.

Si no vas a tener una pбgina web que requiera de los datos de la base de datos, es recomendable usar SQLite. En este caso, solamente la usarб el SA-MP de manera local.


[*] Crear una base de datos SQLite
Crear una base de datos SQLite es muy sencillo, hay que saber que las variables relacionadas a las bases de datos (en PAWN) llevan un etiqueta del tipo DB (database) y que la extensiуn de nuestra base de datos serб del tipo .db.
  • db_open(name[])

    Parбmetros:
    Код:
    name[] -> nombre de la base de datos a abrir/crear.
    Valores Devueltos:
    Код:
    Devuelve una ID que se usa para identificar dicha base de datos.
    Esta funciуn abre una base de datos localizada en scriptfiles, si el nombre de la base de datos no existe, crea una base de datos con el nombre especificado. Es de vital importancia saber que se pueden abrir varias bases de datos a la vez y operar con ellas, entonces db_open devolverб un valor (una ID) que serб el identificador de cada conexiуn local con dicha base de datos, entonces la variable mibasededatosX del ejemplo almacenarб esa ID ъnica. Una base de datos se puede crear dentro de una carpeta en scriptfiles.

    Ejemplo:
    pawn Код:
    /* Creamos las variables que almacenarбn la ID, aсadimos la etiqueta DB */
    new DB:mibasededatosUno;

    new DB:mibasededatosDos;

    public OnGameModeInit()
    {
        /* Abrimos o creamos una base de datos llamada "ejemplo" (localizada en scriptfiles), no olviden la extensiуn .db */
        mibasededatosUno = db_open("ejemplo.db");


        /* Abrimos o creamos una base de datos llamada "ejemplo" (localizada en scriptfiles/micarpeta), no olviden la extensiуn .db */
        mibasededatosDos = db_open("micarpeta/ejemplo.db");



        /* Comprobamos que tenemos acceso a dichas bases de datos */
        if (mibasededatosUno) {
            printf("la base de datos ha sido abierta, o creada. la id es %d", mibasededatosUno);
        } else {
            print("tener este error, serнa una cosa muy extraсa");
        }

        if (mibasededatosDos) {
            printf("la base de datos ha sido abierta, o creada. la id es %d", mibasededatosDos);
        } else {
            print("tener este error, serнa una cosa muy extraсa");
        }
        return 1;
    }

  • db_close(DB:db)

    Paramйtros:
    Код:
    DB:db -> la ID devuelta por db_open.
    Valores Devueltos:
    Код:
    Los valores devueltos por esta funciуn no tienen uso alguno, pero si realmente os interesa, pueden verlos en la SA-MP Wiki haciendo click en el nombre de la funciуn.
    Una vez abierta la base de datos, ejecutamos nuestras consultas (insertar, eliminar, leer, actualizar, etc.), y a continuaciуn la cerramos ya que no hay necesidad de tenerla abierta. En nuestro caso la abrimos en OnGameModeInit y la cerramos finalmente en OnGameModeExit debido a que ejecutaremos una gran cantidad de consultas a travйs de nuestro gamemode, entonces no hay necesidad de abrirla cada dos por tres.

    Ejemplo:
    pawn Код:
    public OnGameModeExit()
    {
        db_close(mibasededatosUno);
        db_close(mibasededatosDos);
        return 1;
    }
Con esto ya podrнamos crear y abrir nuestra primera base de datos, pero estarнa totalmente vacнa, ahн es donde entra en juego SQL.


[*] Estructura de la base de datos
Una base de datos tiene una estructura muy sencilla, estб formada por tablas y estas a su vez contienen filas y columnas, como si se tratara de un documento de Microsoft Excel. Cada columna tiene un nombre y estб definida para almacenar datos de un tipo determinado (texto, nъmeros, etc.), cada registro que se almacena en una tabla darб lugar a una fila. Ejemplo de contenido de una tabla:

idUsuarionombreUsuarioemailUsuario
0Irinelnotavailable@gmail.com
1Otaconnoleemisnotas@gmail.com
Se puede observar que en la tabla anterior existen tres columnas: idUsuario, nombreUsuario, emailUsuario. Tamiйn vemos que existen dos registros en dicha tabla (cada usuario tiene una ID, un nombre y un email), cada registro de datos es una fila, el usuario con la ID 1 se encuentra en la fila 2.

Visto esto, es obvio que en el caso del SA-MP necesitaremos varias tablas para los distintos sistemas del gamemode, por ejemplo: usuarios, vehнculos, casas, etc. Cada tabla tendrнa unas columnas especificas y un contenido relativo a ellas distribuido en filas.

Para almacenar los datos de los usuarios que se van a registrar, primero tenemos que crear la tabla en nuestra base de datos (inicialmente vacнa) y definir las columnas para indicar quй cosa vamos a almacenar, esto lo podemos hacer mandando una consulta SQL a la base de datos.

Para mandar una consulta se usa la siguiente funciуn:
  • db_query(DB:db, query[])

    Parбmetros:
    Код:
    DB:db -> la ID devuelta por db_open para indicar a que base de datos mandamos la consulta.
    query[] -> nuestra consulta escrita en SQL.
    Valores Devueltos:
    Код:
    Devuelve una ID para poder acceder al resultado obtenido (el resultado se almacena en la memoria).
    El resultado es "la respuesta" que nos da la base de datos, el resultado podrнa ser "los datos de 10 filas" o bien podrнa ser un valor tan simple como "true", este resultado DEPENDE de la consulta SQL que ejecutemos. Como el resultado se almacena en la memoria, SIEMPRE tendremos que ELIMINARLO una vez le demos uso.
Para eliminar el resultado y liberar la memoria se usa la siguiente funciуn:
  • db_free_result(DBResult:dbresult)

    Parбmetros:
    Код:
    DBResult:dbresult[] -> la ID del resultado devuelta por db_query.
    Valores Devueltos:
    Код:
    Los valores devueltos por esta funciуn no tienen uso alguno, pero si realmente os interesa, pueden verlos en la SA-MP Wiki haciendo click en el nombre de la funciуn.
    Esta funciуn necesita una ID para saber cuбl es el resultado que ha de eliminar, entonces tendremos que almacenar en una nueva variable esa ID al ejecutar db_query. Esta variable se declara usando la etiqueta DBResult (database result) como veremos a continuaciуn.

Para crear la tabla que hemos visto anteriormente, enviamos esta consulta una vez tengamos la base de datos abierta/creada:
pawn Код:
new DB:midb; /* Variable para almacenar el valor identificador de la base de datos. */

public OnGameModeInit() {
    midb = db_open("datos.db"); /* Abrimos/creamos la base de datos. */

    if (midb) /* Verificamos que el valor identificador de la base de datos es vбlido. */
    {
        new DBResult:resultado; /*Variable para almacenar el valor identificador del resultado. */

        resultado = db_query(midb, "CREATE TABLE IF NOT EXISTS usuarios (idUsuario INTEGER PRIMARY KEY AUTOINCREMENT, nombreUsuario TEXT, emailUsuario TEXT)"); /* Ejecutamos la consulta SQL y almacenamos el valor identificador del resultado. */
   
        db_free_result(resultado); /* Liberamos el resultado, aunque no le hemos dado ningъn uso, ya que no es necesario. */

    }
    return 1;
}

public OnGameModeExit()
{
    db_close(midb); /* Cerramos la base de datos. */
    return 1;
}

[HE PUBLICADO POR ERROR Y ESTOY MODIFICANDO/AСADIENDO CIERTAS COSAS QUE CONSIDERO IMPORTANTES, POR FAVOR, NO COMENTEN SI ESTБN LEYENDO ESTA NOTA YA QUE EL TUTORIAL ESTБ INCOMPLETO. ЎGRACIAS!]
Reply
#2

gracias, excelente tutorial.
saludos.
Reply
#3

Excelente
Reply
#4

Muy buen tutorial, Pero preferiblemente con base a lo que explicaste es mejor usar el MySql.
Reply
#5

Buen tutorial.Gracias por el aporte
Reply
#6

Gracias.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)