猿创征文|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前期准备

  • 前期准备
  1. 要在Unity中使用Sqlite需要将Mono.Data.Sqlite.dll,System.Data.dll, Sqlite3.dll 三个文件放入Plugins文件夹下(注意:文件名必须一样)。
  2. 前两个文件查找方法一:右键自己的Unity 打开文件所在路径 Data Mono lib mono unity (2018测试可以找到)
  3. 路劲查找方法二如
  • 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测试可以找到)
  1. 第三给个文件查找方法:Sqlite3.dll
    在Sqlite的官网下载对应的版本即可 Sqlite3.dll下载

  2. Unity创建StreamingAssets文件夹(名字必须一样)存放创建的数据库

  3. 可以下载Sqlite可视化管理工具
    SQLiteStudio:Sqlite可视化管理工具下载

脚本使用Sqlite(六步走)

使用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 from  user where id=1";

    //查
	sqlComm.CommandText = "Select * From  user";

    //改
	sqlComm.CommandText = "Update  user  set 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 = 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 = 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 = 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

在这里插入图片描述

你可能感兴趣的:(Unity3D,数据持久化技术,sqlite,unity,数据库)