Unity3D中操作Sqlite创建本地数据库实现增删改查

Posted 码码小虫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D中操作Sqlite创建本地数据库实现增删改查相关的知识,希望对你有一定的参考价值。

(文末有git)

开发中,有时需要存储一些用户相关的信息到本地,XML、Json、SQL是常用的手段,json、xml可以用于存储一些量比较小的数据,程序访问也比较方便。但是涉及到数据的增删改查,使用数据库是比较好的方式。这里简单的介绍一下Unity3D中创建数据表的方法。主要实现Unity中使用C#操作Sqlite实现数据的插入、查询、删除。用到的表如下图所示:

ID Name Score Time
1 sunme 30 20
2 super 60 30
3 码码小虫 100 33
3 码码虫 80 15
3 码码小 20 10
3 小虫 40 44

一、创建数据库,建表。
二、向表中插入数据。
三、查询表中的数据。

既然要操作数据库,就需要用到C#的一些数据相关的库文件,在Unity的Assets文件夹下创建一个Plugins文件夹,放入三个库文件,Mono.Data.Sqlite.dll和System.Data.dll和Sqlite3.dll(可在对应的官网下载),在文末的工程文件的Plugins文件夹中有。引入对应的库文件之后,就可以操作Sqlite相关的类了。
创建一个数据库:(数据库存放在StreamingAssets文件夹下)

  public void Start()    {        
     this.CreateSQL();        
     this.OpenSQLaAndConnect();    }    //创建数据库文件    public void CreateSQL()    {        
     if (!File.Exists(Application.streamingAssetsPath + "/" + this.sqlName))        {            
         this.connection = new SqliteConnection("data source=" +
         Application.streamingAssetsPath + "/" + this.sqlName);            
         this.connection.Open();            
         this.CreateSQLTable(                
         "用户",                
         "CREATE TABLE 用户(" +                
         "ID             INT ," +                
         "Name           TEXT," +              
         "Age            INT ," +                
         "Score          INT," +                
         "Time           INT)",              
         null,     null);            
         this.connection.Close();            
         return;        }    }    //打开数据库    public void OpenSQLaAndConnect()    {        
         this.connection = new SqliteConnection("data source=" +
         Application.streamingAssetsPath + "/" + this.sqlName);        
         this.connection.Open();            }    /// <summary>    ///执行SQL命令,并返回一个SqliteDataReader对象    /// <param name="queryString"></param>    public SqliteDataReader ExecuteSQLCommand(string queryString)    {        
         this.command = this.connection.CreateCommand();        
         this.command.CommandText = queryString;        
         this.reader = this.command.ExecuteReader();        
         return this.reader;    }    /// <summary>    /// 通过调用SQL语句,在数据库中创建一个表,顶定义表中的行的名字和对应的数据类型    /// </summary>    /// <param name="tableName"></param>    /// <param name="columnNames"></param>    /// <param name="dataTypes"></param>    public SqliteDataReader CreateSQLTable(string tableName,
       string commandStr=null, string[] columnNames = null, string[] dataTypes = null)
   
{        
         return ExecuteSQLCommand(commandStr);    }    /// <summary>    /// 关闭数据库连接,注意这一步非常重要,最好每次测试结束的时候都调用关闭数据库连接    /// 如果不执行这一步,多次调用之后,会报错,数据库被锁定,每次打开都非常缓慢    /// </summary>    public void CloseSQLConnection()    {        
         if (this.command != null)        {            
         this.command.Cancel();        }        
         if (this.reader != null)        {            
         this.reader.Close();        }        
         if (this.connection != null)        {            
         this.connection.Close();        }        
         this.command = null;        
         this.reader = null;        
         this.connection = null;        Debug.Log("已经断开数据库连接");    }

数据库的创建、连接、关闭已经完成了,接下来,实现向数据表中插入数据,具体代码如下。

 /// <summary>
    /// 向数据库中插入数据
    /// </summary>
    SqliteDataReader InsertDataToSQL(string tableName,string[] insertValues)    {        
    string commandString= "INSERT INTO " + tableName + " VALUES (" + insertValues[0];        
    for (int i = 1; i < insertValues.Length; i++)        {            commandString += "," + insertValues[i];        }        commandString += ")";        
    return ExecuteSQLCommand(commandString);
    }

这里为了临时做测试,我想数据库中添加一些数据

 /// <summary>
    /// 调用数据插入函数,向数据库中插入5条数据
    /// </summary>
    void TempInsertData()    {        
    for (int i = 0; i <5; i++)        {            
        InsertDataToSQL(                
        "用户",                
            new[]                    {                        i.ToString(),"'"+
                       "码码小虫"+IDCount.ToString()+"'",
                       (i * 6).ToString(), (i * 50).ToString(),                        (i*5).ToString()                    });            IDCount++;        }

有些时候需要对整张数据表操作,比如读取数据表中的==所有行的行数==:

int GetRowCount()    {       
       this.command = this.connection.CreateCommand();        
       this.command.CommandText = "select * from 用户";        
       this.reader = this.command.ExecuteReader();            DataTable table=new DataTable();        table.Load(this.reader);        Debug.Log(table.Rows.Count);        
       return table.Rows.Count;    }

对数据表中的数据进行删选,返回满足条件的数据

 public SqliteDataReader ReadTable(string tableName, string[] items, string[] colNames, 
string[] operations, string[] colValues)
   
{        
    string queryString = "SELECT " + items[0];        
    for (int i = 1; i < items.Length; i++)        {            queryString += ", " + items[i];        }        queryString += " FROM " + tableName + " WHERE " +
             colNames[0] + " " + operations[0] + " " + colValues[0];        
     for (int i = 0; i < colNames.Length; i++)        {          queryString += " AND " + colNames[i] + " " + operations[i]
             + " " + colValues[0] + " ";        }        
    return this.ExecuteSQLCommand(queryString);    }

调用方式如下所示,放在触发函数

            var tempCount = 0;

            ReadTable("用户", new[] { "Age", "Time","Name" }, new[] { "Score" }, 
           new[] { ">=" }, new[] { "10" });            
           while (this.reader.Read())            {                tempCount++;                Debug.Log(reader.GetString(reader.GetOrdinal("Name")));              
               // Debug.Log(reader.GetInt32(reader.GetOrdinal("Time")));                // Debug.Log(tempCount);            }

博客:

http://blog.csdn.net/jianzuoguang/article/details/79087995

以上是关于Unity3D中操作Sqlite创建本地数据库实现增删改查的主要内容,如果未能解决你的问题,请参考以下文章

sqlite数据库之简单操作

Unity3D之SQLite让数据库开发更简单

Web重温系列:SQLite+EF6实现本地化存储

Unity3d在各个平台读取Sqlite3数据库

如何维护sqlite本地数据库并在线更新..?

Unity3D游戏开发之SQLite让数据库开发更简单