viernes, 25 de septiembre de 2015

Utilizar SQLite con Unity Parte 2


Saludos amigos.

Hoy os traigo un ejemplo de como crear una base de datos con SQLite, crear el código necesario en un texto y como escribirlo en un archivo binario.





#pragma strict
#pragma downcast


import System;
import System.Data;
import Mono.Data.Sqlite;

import System.IO;
import System.Reflection;

class Data_Ficha_ProgresoJugador extends System.Object {
 
 var vidaMax : int = 100;
 var vidaActual : int = 100;
 var cansancioMax : int = 100;
 var cansancioActual : int = 100;
 var hambreMax : int = 100;
 var hambreActual : int = 100;
 var manaMax : int = 100;
 var manaActual : int = 100;
 var estaminaMax : int = 100;
 var estaminaActual : int = 100;
 var sedMax : int = 100;
 var sedActual : int = 100;
 
}

////////////////////////////////////

private var conexion : IDbConnection;
private var comando : IDbCommand;
private var reader : IDataReader;

////////////////////////////////////

function Awake () {
 
 DontDestroyOnLoad (this);
 
}

////////////////////////////////////

var log : boolean = true;

var nombreJugador : String = "NombreIni";
var nombrePartida : String = "000";

function OnGUI () {
 
 if (GUI.Button(Rect(10,10,200,20),"CreaDB_Partida")){
  CreaDB_Partida (nombreJugador, nombrePartida, 0, 0, null);
 }
 
 if (GUI.Button(Rect(10,40,200,20),"codigoSQL Data Lineal")){
  Log_Crea_CodigoSQL_Lineal (false);
 }
 if (GUI.Button(Rect(10,60,200,20),"codigoSQL Data")){
  Nueva_DataDb_Partida (""+nombreJugador, 0, 0, null);
 }
 
 if (GUI.Button(Rect(10,90,200,20),"LogCreaDb_bin")){
  Log_CreaDB_bin ();
 }
 if (GUI.Button(Rect(10,110,200,20),"Log_LeeDB_bin")){
  Log_LeeDB_bin ();
 }
 
 if (GUI.Button(Rect(10,140,200,20),"Log_Crea_Txt_DB")){
  Log_Crea_Txt_DB ();
 }
 
 if (GUI.Button(Rect(10,170,200,20),"Borra_Jugador")){
  Borra_Jugador (nombreJugador);
 }
 if (GUI.Button(Rect(10,190,200,20),"BorraDB_Partida")){
  BorraDB_Partida (nombreJugador, nombrePartida);
 }
 
}

function Start () {
 
 if(log){Debug.Log("persistentDataPath --> " + Application. persistentDataPath);}
 if(log){Debug.Log("dataPath --> " + Application. dataPath);}
 
 CreaCarpetas ();
 
}

function Update () {
 
 
}

function CreaCarpetas () {
 
 if (!Directory.Exists (Application.persistentDataPath + "/SaveGame")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/SaveGame");
 }
 if (!Directory.Exists (Application.persistentDataPath + "/Temp")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/Temp");
 }
 if (!Directory.Exists (Application.persistentDataPath + "/Resources")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/Resources");
 }
 
}

////////////////////////////////////

////////////////////////////////////

var codigoSQL : String[];
var codigoSQL_bin : String[];
var codigoSQL_Lineal : String;

function Log_Crea_CodigoSQL_Lineal (bol:boolean){
    
 // Rellena codigoSQL
    Nueva_DataDb_Partida (""+nombreJugador, 0, 0, null);
 // RESET codigoSQL_Lineal
 codigoSQL_Lineal = "";
 
 for(var i : int = 0;i< codigoSQL.Length;i++){
  if(codigoSQL[i] != ""){
   codigoSQL_Lineal += codigoSQL[i];
   if(bol){
    codigoSQL_Lineal += "\r\n";
   }
  }
 }
 
}

/////////////// bin //////////////////

// BIN --> CreaDB
function Log_CreaDB_bin (){
    
 var _ruta : String = Application.persistentDataPath+"/SaveGame/";
 
 var fs : FileStream;
 var w : BinaryWriter;
 if (File.Exists(_ruta+"LogCreaDb_bin.dat")){
  fs = new FileStream(_ruta+"LogCreaDb_bin.dat", FileMode.Truncate);
 }else{
     fs = new FileStream(_ruta+"LogCreaDb_bin.dat", FileMode.Create);
    }
 w = new BinaryWriter(fs);
 
 Log_Crea_CodigoSQL_Lineal (false);
 
 w.Write(codigoSQL_Lineal);
 
 w.Close();
 fs.Close();
 
}

// BIN --> LeeDB
var readerReadByte : int = 0;

function Log_LeeDB_bin (){
    
 var lineArray = new Array();
 var _ruta : String = Application.persistentDataPath+"/SaveGame/";
 
 if (File.Exists(_ruta+"LogCreaDb_bin.dat")){
  
  var fs : FileStream = new FileStream(_ruta+"LogCreaDb_bin.dat", FileMode.Open, FileAccess.Read);
  var reader : BinaryReader = new BinaryReader(fs);
  
  reader.BaseStream.Position = 0x00000000;
  var _bytes : byte[]= reader.ReadBytes(readerReadByte);
  
  lineArray.Add(reader.ReadString());
  
  fs.Close();
 }
 
 codigoSQL_bin = lineArray.ToBuiltin(String) as String[];
 
}

/////////////// Txt //////////////////

// Txt --> CreaDB
function Log_Crea_Txt_DB (){
    
 if (!Directory.Exists (Application.persistentDataPath + "/SaveGame/")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/SaveGame/");
 }
 
 Nueva_DataDb_Partida (""+nombreJugador, 0, 0, null);
 
 var _ruta : String = Application.persistentDataPath+"/SaveGame/";
 
 var sw : StreamWriter = new StreamWriter(_ruta+"LogCreaDb.txt", true);
 
 for(var i : int = 0;i< codigoSQL.Length;i++){
  sw.WriteLine(codigoSQL[i]);
 }
 sw.Close();
 
}

/////////////// Borra DataBase (Partida) //////////////////

function BorraDB_Partida (jugador : String, partida : String){
    
    var dirData : String = Application.persistentDataPath + "/SaveGame/" + jugador;
 var ruta : String = Application.persistentDataPath + "/SaveGame/" + jugador + "/" + partida;
 
 if (Directory.Exists (dirData)) {
  var dirInfo : DirectoryInfo = new DirectoryInfo(dirData);
  for(var file : FileInfo in dirInfo.GetFiles() ){
   file.Delete();
  }
 }
 
}

/////////////// Borra Carpeta (Jugador) //////////////////

function Borra_Jugador (jugador : String){
    
    var dirData : String = Application.persistentDataPath + "/SaveGame/" + jugador;
 
 if (Directory.Exists (dirData)) {
  Directory.Delete(dirData,true);
 }
 
}

/////////////// Crea DataBase (Partida) //////////////////

function CreaDB_Partida (jugador : String, partida : String, Tipo : int, Id : int, 
       progresoData : Data_Ficha_ProgresoJugador){
    
 if (!Directory.Exists (Application.persistentDataPath + "/SaveGame/" + jugador)) {
  Directory.CreateDirectory (Application.persistentDataPath + "/SaveGame/" + jugador);
 }
 
 Nueva_DataDb_Partida (""+jugador, Tipo, Id, progresoData);
 
    RutaToURI();
 _URI = "URI=file:" + rutaURI + "SaveGame" + "\\" + "\\" + jugador + "\\" + "\\" + partida;
    if(log){Debug.Log("_URI --> " + _URI);}
    
    try {
     conexion = new SqliteConnection(_URI);
  conexion.Open();
  Log_Crea_CodigoSQL_Lineal (false);
  if(codigoSQL_Lineal != ""){
   EjecutaCodigoSQL(codigoSQL_Lineal);
  }
  
  CierraDB();
 }catch(e){
        Debug.Log(":::Error::: CreaDB_Partida ()");
        Debug.Log(e);
    }
    
}

function Nueva_DataDb_Partida (Nombre : String, Tipo : int, Id : int,progresoData : Data_Ficha_ProgresoJugador){
 var pun : int = 0;
 codigoSQL = new String[4];
 
 codigoSQL[0] = "CREATE TABLE Jugador (Nombre Text, Tipo INT, Id INT);";
 codigoSQL[1] = "INSERT INTO Jugador VALUES('"+Nombre+"', "+Tipo+", "+Id+");";
 codigoSQL[2] = "CREATE TABLE Progreso (Nombre Text, Valor INT, Id INT);";
 
 var _PD : Data_Ficha_ProgresoJugador = new Data_Ficha_ProgresoJugador();
 if(progresoData != null){
  _PD = progresoData;
 }
 pun = codigoSQL.Length-1;
 var Type_PD : Type = typeof(Data_Ficha_ProgresoJugador);
 var fields_PD : FieldInfo[] = Type_PD.GetFields(BindingFlags.Public 
                        | BindingFlags.Instance);
 codigoSQL = AjustaLengthArray(codigoSQL, fields_PD.Length);
 for(var i : int = 0; i < fields_PD.Length; i++){
  var nombre : String = fields_PD[i].Name;
  var valor : int = fields_PD[i].GetValue(_PD);
  codigoSQL[pun+i] = "INSERT INTO Progreso VALUES('"+nombre+"', "+valor+", "+i+");";
  
 }
 
}

function AjustaLengthArray(_codigoSQL : String[], lenPlus:int){
 
 var query : String[] = _codigoSQL; 
 var queryTemp : String[] = new String[query.Length+lenPlus]; 
 if (lenPlus > 0) {
  if (query.Length > 0) {
   for(var i : int = 0; i < query.Length; i++){
    queryTemp[i] = query[i];
   }
  }else{
   queryTemp = new String[lenPlus];
  }
  return queryTemp;
 }else{
  return query;
 }
 
}

////////////////////////////////////

function EjecutaCodigoSQL(codigoSQL : String){
 
 var query : String;
 query = "" + codigoSQL; 
 comando = conexion.CreateCommand();
 comando.CommandText = query; 
 reader = comando.ExecuteReader();

}

function CierraDB(){
 reader.Close();
 reader = null; 
 comando.Dispose(); 
 comando = null; 
 conexion.Close(); 
 conexion = null; 
}

////////////////////////////////////

var rutaURI : String;
var _URI : String;

function RutaToURI(){
    //Uniform Resource Identifier or URI
    rutaURI = "";
    var dataURI : String [];
    var ruta : String = Application. persistentDataPath;
    dataURI = ruta.Split(char.Parse("/"));
    for(var i : int = 0;i< dataURI.Length;i++){
  rutaURI += dataURI[i] + "\\" + "\\";
 }
 if(log){Debug.Log("rutaURI --> " + rutaURI);}
 
}


////////////////////////////////////

/*

https://www.sqlite.org/inmemorydb.html


https://msdn.microsoft.com/es-es/library/system.io.filesysteminfo(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/system.io.directoryinfo(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/system.reflection.fieldinfo(v=vs.80).aspx

https://msdn.microsoft.com/es-es/library/system.io.binaryreader(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/system.io.filestream(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/ms404377(v=vs.110).aspx

*/

////////////////////////////////////