Hola a todos, esta publicación se centrará en trabajar con la Base de datos relacional incorporada SQLite de Unity. Este artículo fue escrito por un novato para principiantes con el objetivo de mostrarle cómo trabajar con SQLite, se supone que conoce los conceptos básicos de SQL. Como no existe un tutorial claro para principiantes en Internet, decidí ocupar este nicho. En este artículo, escribiremos una clase simple para trabajar con este DBMS, que se puede utilizar para resolver una amplia gama de problemas (localización, almacenamiento de datos, mantenimiento de diferentes tablas).
¿Qué es SQLite y por qué lo necesitamos?
SQLite es un sistema de gestión de bases de datos relacionales integrado compacto que es bastante popular. Una ventaja importante de SQLite es su multiplataforma, por lo que podemos usar SQLite para varias plataformas. SQLite se puede usar cuando se necesita velocidad y compacidad, por lo tanto, en caso de un problema de almacenamiento de datos, decidí resolverlo usando este DBMS.
¿Cómo trabajar con SQLite?
Para crear y editar nuestra base de datos, hay una gran cantidad de utilidades y complementos gratuitos para navegadores, personalmente usaré DB Browser (SQLite), me enganchó con su simplicidad y me pareció muy poco conveniente trabajar con varios complementos en el navegador. En general, quien lo quiera funciona así. Con DB Browser, puede crear fácilmente tablas, hacer conexiones entre ellas y llenarlas con datos sin recurrir al uso de SQL. Además, en DB Browser, puede hacer todo con bolígrafos utilizando SQLite, por lo que aquí es más conveniente para alguien.
Crear y completar una base de datos de prueba.
Creamos una base de datos en
Assets / StreamingAssets de nuestro proyecto (lo tengo db.bytes, ya que Unity solo comprende
* .bytes para bases de datos, usaremos esta extensión). Simplemente, por ejemplo, creé una base de datos con las siguientes tablas:
1) Tabla "Jugador", que describe la esencia del jugador:
CREATE TABLE "Player" ( "id_player" INTEGER NOT NULL, "nickname" TEXT NOT NULL, PRIMARY KEY("id_player") );
Lo llenó con los siguientes datos:

2) Tabla "Puntuaciones", que se introduce para aumentar el nivel de normalización de la base de datos
CREATE TABLE "Scores" ( "id" INTEGER NOT NULL, "id_player" INTEGER NOT NULL, "score" INTEGER NOT NULL, PRIMARY KEY("id"), FOREIGN KEY("id_player") REFERENCES "Player"("id_player") );
Lo llenó con los siguientes datos:

Conectando bibliotecas
Creamos una base de datos en Assets / StreamingAssets de nuestro proyecto (tengo db.bytes), luego necesitamos conectar las bibliotecas para trabajar con esta base de datos. Descargue el
archivo sqlite3.dll del
sitio oficial para trabajar con SQLite en Windows. Me tomó un par de días hacer que este ACBD se hiciera amigo de Android, ya que la biblioteca indicada en
este artículo resultó no funcionar, personalmente no pude trabajar con ella en Android, los errores aumentaron constantemente, por esto cargué esto encontrado en algún lugar de Internet
versión de la biblioteca para Android. Aquí colocamos las bibliotecas:
Assets / Plugins / sqlite.dll y
Assets / Plugins / Android / sqlite.so .
Después de todas estas manipulaciones, copie
System.Data.dll y
Mono.Data.Sqlite.dll de
C: \ Archivos de programa (x86) \ Unity \ Editor \ Data \ Mono \ lib \ mono \ 2.0 y pegue los
Activos / Complementos de su proyecto Unity. Quiero señalar que en la versión 2018, Unity puede escribir que System.Data.dll ya está conectado y hay un conflicto de dos archivos idénticos. En realidad, esto se resuelve simplemente, no eliminamos el recién insertado
System.Data.dll .
La estructura de las bibliotecas debe ser la siguiente:Assets / Plugins / Mono.Data.Sqlite.dll - solo es necesario :)
Assets / Plugins / System.Data.dll - razón similar
Assets / Plugins / sqlite3.dll : para trabajar con SQLite en Windows
Assets / Plugins / Android / libsqlite3.so - para trabajar con SQLite en Android
Escribir un script para trabajar con la base de datos
Y finalmente, podemos comenzar a escribir un script para trabajar con la base de datos creada. Primero, cree un archivo MyDataBase y conecte las bibliotecas
System.Data ,
Mono.Data.Sqlite ,
System.IO , haga que la clase MyDataBase sea estática y, por supuesto, elimine la herencia de MonoBehaviour. Agregue 3 variables privadas y una constante con el nombre del archivo de base de datos. Deberíamos obtener algo como esto:
using UnityEngine; using System.Data; using Mono.Data.Sqlite; using System.IO; static class MyDataBase { private const string fileName = "db.bytes"; private static string DBPath; private static SqliteConnection connection; private static SqliteCommand command; }
Todo esto es bueno, por supuesto, pero no podremos trabajar con la base de datos. Para trabajar con la base de datos, necesitamos obtener la ruta a ella, propongo hacer un constructor estático, que solo obtendrá la ruta a la base de datos (recuerdo que la base de datos se encuentra en StreamingAssets).
static MyDataBase() { DBPath = GetDatabasePath(); }
Nota Necesitamos desempaquetar la base de datos en las rutas especificadas (
Application.dataPath / db.bytes para Windows y
Application.persistentDataPath / db.bytes para Android) ya que la carpeta StreamingAssets, después del ensamblado, tiene el atributo ReadOnly (excepto para Android) y no podremos escribir nada luego en la base de datos. En realidad, para poder escribir algo en la base de datos, desempaquetamos nuestra base de datos. Se dice en detalle qué caminos, bajo qué plataforma usar en
este artículo .
Escribiremos métodos para abrir y cerrar una conexión, así como un método que ejecutará una solicitud que no requiera valores de retorno, por ejemplo, INSERT, UPDATE, CREATE, DELETE, DROP.
Milagrosamente, ahora nuestro script puede ejecutar solicitudes de modificación de datos. Pero, ¿qué pasa con un SELECT muy importante? Decidí que el valor de retorno del método que debería ejecutar la consulta para la selección de datos debería ser del tipo o cadena DataTable, si desea obtener 1 valor. Para hacer esto, escribe 2 métodos:
Hecho, ahora tenemos un script simple que puede hacer solicitudes de modificación y selección de datos. Escribamos el script de ScoreManager ahora. El cual recibirá una tabla de los mejores resultados ordenados en orden descendente. Y, para verificación, muestre el apodo del líder y sus puntos en Debug.Log.
using System.Collections; using System.Collections.Generic; using System.Data; using UnityEngine; public class ScoreManager : MonoBehaviour { private void Start() {
Esto es lo que obtenemos en el inicio:

Gracias por su atención, con mucho gusto aceptaré críticas constructivas.