参考:[ http://blog.csdn.net/qinyuanpei/article/details/46812655]
(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 class SQLManager : MonoBehaviour
{
///
/// 数据库连接对象
///
private SqliteConnection connection;
///
/// 数据库命令
///
private SqliteCommand command;
///
/// 数据读取定义
///
private SqliteDataReader reader;
///
/// 本地数据库名字
///
public string sqlName;
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();
}
///
///执行SQL命令,并返回一个SqliteDataReader对象
///
public SqliteDataReader ExecuteSQLCommand(string queryString)
{
this.command = this.connection.CreateCommand();
this.command.CommandText = queryString;
this.reader = this.command.ExecuteReader();
return this.reader;
}
///
/// 通过调用SQL语句,在数据库中创建一个表,顶定义表中的行的名字和对应的数据类型
///
///
///
///
public SqliteDataReader CreateSQLTable(string tableName, string commandStr=null, string[] columnNames = null, string[] dataTypes = null)
{
//string queryString = "CREATE TABLE " + tableName + "( " + columnNames[0] + " " + dataTypes[0];
//for (int i = 1; i < columnNames.Length; i++)
//{
// queryString += ", " + columnNames[i] + " " + dataTypes[i];
//}
//queryString += " ) ";
// return ExecuteSQLCommand(queryString);
return ExecuteSQLCommand(commandStr);
}
///
/// 关闭数据库连接,注意这一步非常重要,最好每次测试结束的时候都调用关闭数据库连接
/// 如果不执行这一步,多次调用之后,会报错,数据库被锁定,每次打开都非常缓慢
///
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("已经断开数据库连接");
}
//当退出应用程序的时候关闭数据库连接
private void OnApplicationQuit()
{
//当程序退出时关闭数据库连接,不然会重复打开数据卡,造成卡顿
this.CloseSQLConnection();
Debug.Log("程序退出");
}
数据库的创建、连接、关闭已经完成了,接下来,实现向数据表中插入数据,具体代码如下。
///
/// 向数据库中插入数据
///
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);
这里为了临时做测试,我想数据库中添加一些数据
///
/// 调用数据插入函数,向数据库中插入5条数据
///
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/qinyuanpei/article/details/46812655
Git地址:
扫码获取文章地址(文末有工程地址):