【Unity3D|猿创征文|UnitySqlite持久化数据】@作者 : SYFStrive
@博客首页 : HomePage
:个人社区(欢迎大佬们加入) :社区链接
:觉得文章不错可以点点关注 :专栏连接
:程序员每天坚持锻炼
:点击直接阅读文章
文章图片
文章图片
Unity持久化数据()
目录
-
- SQLite简单说明
- SQLite前期准备
- 脚本使用Sqlite(六步走)
-
- 一、引入命名空间 using Mono.Data.Sqlite;
- 二、创建链接数据库的路径
- 三、实例化数据库连接对象,并绑数据库路径 (SqliteConnection)
- 四、操作数据库 (SqliteCommand )
- 五、执行Sql语句 (SqliteDataReader(提供用于读取对SQLite数据库执行的命令的结果方法(简称是一个读取器))……)
- 六、程序关闭时
- 最后
SQLite简单说明 SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中,以嵌入式作为它的设计目标,它占用资源非常的低,因此适合在嵌入式设备如Android、Ruby on Rails等中使用。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟和C、C++、Ruby、轻型的数据库Python、C#、PHP 、Java等编程语言相结合。SQLite是一个以文件形式存在的关系型数据库,尽管无法实现分布式和横向扩展,可是作为一个轻量级的嵌入式数据库,它不需要系统提供服务支持,通过SDK直接操作文件避免了对数据库维护的相关事务,从这个角度来讲它是一个出色的数据库。
SQLite前期准备
- 前期准备
- 要在Unity中使用Sqlite需要将Mono.Data.Sqlite.dll,System.Data.dll, Sqlite3.dll 三个文件放入Plugins文件夹下(注意:文件名必须一样)。
- 前两个文件查找方法一:右键自己的Unity 打开文件所在路径 Data Mono lib mono unity (2018测试可以找到)
- 路劲查找方法二如
- Mono.Data.Sqlite.dll
1、在Unity的Editor安装目录下“ Editor\Data\Mono\lib\mono\2.0\ Mono.Data.Sqlite.dll”(2018测试可以找到)
2、\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-macos (2021测试可以找到) - System.Data.dll(2018测试可以找到)
1.在Unity的Editor安装目录下“ Editor\Data\Mono\lib\mono\2.0\ System.Data.dll”(2018测试可以找到)
2、\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-macos (2021测试可以找到)
- 第三给个文件查找方法:Sqlite3.dll
在Sqlite的官网下载对应的版本即可 Sqlite3.dll下载
- Unity创建StreamingAssets文件夹(名字必须一样)存放创建的数据库
- 可以下载Sqlite可视化管理工具
SQLiteStudio:Sqlite可视化管理工具下载
一、引入命名空间 using Mono.Data.Sqlite;
代码如:
using Mono.Data.Sqlite;
二、创建链接数据库的路径
代码如:
///
/// 第二步创建路径
///
public string GetDataBasePath(string pathName)
{
//判断pathName不为空
if (pathName!=null)
//创建数据库访问路径
return dataBasePath = "Data Source(固定写法) =" + Application.streamingAssetsPath + "/" + pathName(数据库名) + ".db";
return null;
}
三、实例化数据库连接对象,并绑数据库路径 (SqliteConnection)
代码如:
//数据库连接对象
private SqliteConnection sqlConn;
///
/// 第三步实例化数据库连接对象
///
private void NewSqlObj(string useSqlName(数据库名), string pathName(数据库路径))
{
//实例化数据库连接对象,并绑数据库路径
sqlConn = new SqliteConnection(pathName);
//打开连接
sqlConn.Open();
//调用创建数据库Obj
CreateSqliteObj(useSqlName);
}
四、操作数据库 (SqliteCommand )
SqliteCommand使用方法如:
方法名 | 方作用 |
---|---|
Cancel() | 尝试取消命令的执行。什么也没做。 |
Dispose(Boolean) | 释放连接使用的所有资源并关闭它。 |
ExecuteDbDataReader(CommandBehavior) | 针对数据库执行CommandText并返回数据读取器 |
ExecuteDbDataReaderAsync(CommandBehavior, CancellationToken) | 针对数据库异步执行CommandText并返回数据读取器。 |
ExecuteNonQuery() | 对数据库执行CommandText 。 |
ExecuteReader() | 针对数据库执行CommandText并返回数据读取器。 |
ExecuteReader(CommandBehavior) | 针对数据库执行CommandText并返回数据读取器。 |
ExecuteReaderAsync() | 针对数据库异步执行CommandText并返回数据读取器。 |
ExecuteReaderAsync(CancellationToken) | 针对数据库异步执行CommandText并返回数据读取器。 |
ExecuteReaderAsync(CommandBehavior) | 针对数据库异步执行CommandText并返回数据读取器。 |
ExecuteReaderAsync(CommandBehavior, CancellationToken) | 针对数据库异步执行CommandText并返回数据读取器。 |
ExecuteScalar() | 对数据库执行CommandText并返回结果。 |
Prepare() | 在数据库上创建命令的准备版本。 |
//数据库指令对象(简单理解操作数据库)
private SqliteCommand sqlComm;
///
/// 创建数据库指令函数 第四步
///
private void CreateSqliteObj(string useSqlName)
{
//创建数据库指令函数对象
sqlComm = sqlConn.CreateCommand();
//使用Sql语法增删查改……//增
sqlComm.CommandText = "insert into user Values (5, 'Guu')";
//删
sqlComm.CommandText = "delete fromuser where id=1";
//查
sqlComm.CommandText = "Select * Fromuser";
//改
sqlComm.CommandText = "Updateuserset name='三把斧' where id=5 ";
}
五、执行Sql语句 (SqliteDataReader(提供用于读取对SQLite数据库执行的命令的结果方法(简称是一个读取器))……)
SqliteDataReader相关使用方法如下:
特性
特性名 | 作用 |
---|---|
Depth | 获取当前行的嵌套深度。始终为零。 |
FieldCount | 获取当前行的列数。 |
Handle | 获取底层准备好的语句的句柄。 |
HasRows | 获取一个值,该值指示数据读取器是否包含任何行。 |
IsClosed | 获取一个值,该值指示数据读取器是否已关闭。 |
Item[Int32] | 获取指定列的值。 |
Item[String] | 获取指定列的值。 |
RecordsAffected | 获取插入、更新或删除的行数。-1 用于 SELECT 语句。 |
方法名 | 作用 |
---|---|
Close() | 关闭数据读取器。 |
Dispose(Boolean) | 释放数据读取器使用的任何资源并关闭它。 |
GetBoolean(Int32) | 以Boolean形式获取指定列的值。 |
GetByte(Int32) | 以Byte形式获取指定列的值。 |
GetChar(Int32) | 以Char形式获取指定列的值。 |
GetDataTypeName(Int32) | 获取指定列的值作为DateTime。 |
GetFieldType(Int32) | 获取指定列的数据类型。 |
GetFieldValue(Int32) | 获取指定列的值。 |
GetFloat(Int32) | 获取指定列的值作为Single。 |
GetGuid(Int32) | 获取指定列的值作为Guid。 |
GetInt16(Int32) (Int32) | 获取指定列的值作为Int16。 |
GetInt32(Int32) | 获取指定列的值作为Int32。 |
GetInt64(Int32) | 获取指定列的值作为Int64。 |
GetName(Int32) | 获取指定列的名称。 |
GetOrdinal(String) | 获取指定列的序号。 |
GetString(Int32) | 以String式获取指定列的值。 |
GetValue(Int32) | 获取指定列的值。 |
IsDBNull(Int32) | 获取一个值,该值指示指定列是否为DBNull。 |
NextResult() | 前进到批处理语句的下一个结果集。 |
Read() | 前进到结果集中的下一行。 |
//数据库读取对象
private SqliteDataReader sqlReader;
(第三种方法用到的)//执行Sql语句 三种方法……//第一种 返回查询第一行第一列的数据结果
//object value = https://www.it610.com/article/sqlComm.ExecuteScalar();
//第二种 返回受影响的行数该方法适合 增、删、改
//int rowS = sqlComm.ExecuteNonQuery();
//第三种 返回SqliteCommand
//sqlReader = sqlComm.ExecuteReader();
///
/// 执行Sql语句 增
///
private void ImplementInsertSqlStatement()
{
int rowS = sqlComm.ExecuteNonQuery();
Debug.Log("增受影响的行数:" + rowS.ToString());
(如:增了1条数据就打印1)
}///
/// 执行Sql语句 删
///
private void ImplementDeleteSqlStatement()
{
int rowS = sqlComm.ExecuteNonQuery();
Debug.Log("删受影响的行数:" + rowS.ToString());
(如:删除了1条数据就打印1)
}///
/// 执行Sql语句 查
///
private void ImplementSelectInsterSqlStatement()
{
//查询方法一
//object value = https://www.it610.com/article/sqlComm.ExecuteScalar();
//查询方法二
//执行Sql语句,返回查询后的结果 类型:SqliteDataReader
//执行返回查询多个数据的sql语句
sqlReader = sqlComm.ExecuteReader();
如下以SqliteDataReader 为例
//保存内容
string currentColumn ="";
//循环变量打印表类型 (玩法一)
for (int i = 0;
i < sqlReader.FieldCount;
i++)
{
currentColumn += sqlReader.GetName(i);
currentColumn += "\t";
}
Debug.Log(currentColumn);
//(sqlReader.Read())循环变量打印表的数据执行下一行没有就返回false (玩法二)
while (sqlReader.Read())
{
currentColumn = "";
//返回查询值的列
//object value = https://www.it610.com/article/sqlReader.GetValue(0);
//查询所有内容
for (int i = 0;
i < sqlReader.FieldCount;
i++)
{
currentColumn += sqlReader.GetValue(i);
currentColumn +="\t";
}
Debug.Log(currentColumn);
} //(玩法三)IsClosed检查对象是否已经被关闭。如果在连接上调用了 close方法或者发生某些严重的错误,则连接被关闭。只有在调用了 Connection.close 方法之后被调用时,此方法才保证返回 true。 (不作判断会报错)
if (!sqlReader.IsClosed)
sqlReader.Close();
sqlComm.CommandText = "Select * from user where id=8";
sqlReader = sqlComm.ExecuteReader();
}///
/// 执行Sql语句 改
///
private void ImplementUpdateInsterSqlStatement()
{
int rowS = sqlComm.ExecuteNonQuery();
Debug.Log("改受影响的行数:" + rowS.ToString());
(如:改了1条数据就打印1)
}
六、程序关闭时
代码如:
//在应用程序退出前,发送给所有游戏对象。
private void OnApplicationQuit()
{
ProgramClosureImplement();
}///
/// 程序关闭时执行
///
private void ProgramClosureImplement()
{
if (sqlConn!= null)
//关闭连接
sqlConn.Close();
if (sqlComm != null)
//释放数据
sqlComm.Dispose();
if (sqlReader != null)
//释放读取
sqlReader.Close();
}
最后
文章图片
本文到这里就结束了,大佬们的支持是我们更新的最大动力,希望这篇文章能帮到大家
相关专栏连接
文章图片
下篇文章再见ヾ( ̄▽ ̄)ByeBye
文章图片
推荐阅读
- 面试题|MySQL高性能实战——part5——查询性能优化
- 杭电计算机考研|数据库面试常见问题
- MySQL|MySQl学习笔记-6.数据库的备份
- mysql|MySQL分页查询
- MySQL数据库|Day1_9 Java学习之DQL语言与完整性约束
- Hive|SQL笔记--语法
- mysql|MySQL教程 - 视图(View)
- 数据库|Dataset用法实践之二 C#数据层模块DLL
- mysql优化|尚硅谷MySQL高级笔记——前篇