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创建本地数据库实现增删改查的主要内容,如果未能解决你的问题,请参考以下文章