美文网首页Unity 学习路径
Unity工具—Mono.Data.Sqlite 使用

Unity工具—Mono.Data.Sqlite 使用

作者: Warl_G | 来源:发表于2020-03-10 17:05 被阅读0次

    为实现 Unity 下操作数据库,集成 Mono.Data.Sqlite, 并为实现快捷操作封装了 SqliteHelper

    本文原地址:Unity工具-Mono.Data.Sqlite 使用

    源码与文档

    微软 Xamarin 官方 Mono.Data.Sqlite Android 示例

    微软 Xamarin 官方 Mono.Data.Sqlite iOS 示例

    Microsoft.Data.Sqlite 是微软 .NET 官方提供的 Sqlite 库,因为由同一作者编写,两者十分相似,所以 .NET 官方文档可用于参考

    另附 C# API 查询工具:HotExamples

    集成 Sqlite

    参考此非常全的集成流程

    获取 Mono.Data.Sqlite.dll

    想在 Unity 中使用 Sqlite 需要使用 Mono.Data.Sqlite.dll,该库为C# API,可直接从 Unity 客户端中获取

    以 Mac 为例,大部分网上提供的目录为 /Unity.app/Contents/MonoBleedingEdge/lib/mono/2.0-api/Mono.Data.Sqlite.dll 但实际使用会发现该目录下的 dll 会出现版本无法兼容、提示加载失败等问题

    后发现 /Unity.app/Contents/Mono/lib/mono/2.0/Mono.Data.Sqlite.dll 更加稳定,经测试 2019.2.0f1、2018.4.16f1、2017.4.37f1 之间可互相使用,无异常

    另外其他博文有提到不同版本 Unity 会包含不同版本的 Mono.Data.Sqlite.dll ,会引发兼容性问题,使用时注意 PlayerSetting 中 Api Compatibility Level 需选择 .NET Standard 2.0 ,但本文测试设置为 .NET 4.x 也能正常运行

    iOS 与 macOS 环境配置

    无需额外配置,直接使用即可

    Android 环境配置

    Android 还需 libsqlite3.so ,该库为 sqlite3 由 C 编译得来,为适配不同的 Android 架构可下载

    armeabi-v7a 放入 Assets/Plugins/Android/libs/armeabi-v7a

    arm64-v8a 放入 Assets/Plugins/Android/libs/arm64-v8a

    x86 放入 Assets/Plugins/Android/libs/x86

    对应 so 文件放入目录后选中,于 Inspector 的 platform 仅选择 Android,架构根据版本选择

    Windows 环境配置

    Windows 需额外添加 sqlite3.dll 可从官网下载

    Windows 分为 x86 和 x64 架构,根据需求添加于 Unity 项目中 Asset/Plugins/x86Asset/Plugins/x86_64目录下,选中该dll,于 Inspector 中仅勾选 Standalone 平台和对应架构

    疑问

    1. System.Data.dll 没用到

      网上很多文章(甚至 Xamarin 官方 )提到需将与 Mono.Data.Sqlite 同目录下的 System.Data.dll 一同添加到 Plugin 中(或全平台或仅 Android 平台)以保证版本同一,但实际测试发现,没有导入也可正常运行

    2. sqlite3.dll 仅用于 Windows 平台

      另有说法,Android 需添加 sqlite3.dll 到 Plugin,但实际测试没添加也能正常运行

    Mono.Data.Sqlite 使用

    SqliteConnection

    1. 打开与关闭数据库

      //需带'Data Source='前缀
      SqliteConnection connection = new SqliteConnection("Data Source=" + dbPath);
      //打开
      connection.Open();
      //关闭
      connection.Close();
      

    SqliteCommand

    1. 构造操作指令

      SqliteConnection connection = new SqliteConnection("Data Source=" + dbPath);
      //包括但不限于以下方法
      SqliteCommand command = new SqliteCommand("SELECT * FROM table");
      SqliteCommand command = new SqliteCommand("SELECT * FROM table", connection);
      SqliteCommand command = new SqliteCommand("SELECT * FROM table", connection, transaction);
      SqliteCommand command = connection.CreateCommand();
      command.CommandText = "SELECT * FROM table";
      
      
      
    2. 执行与取消

      SqliteCommand command = connection.CreateCommand();
      command.CommandText = "SELECT * FROM table";
      
      //执行并取得结果
      SqliteDataReader reader = command.ExecuteReader();
      //执行并返回执行行数 仅适用于INSERT、DELETE、UPDATE,其他语句返回0官方文档说返回-1
      int executeRowsCount = command.ExecuteNonQuery();
      //执行并返回结果的第一行第一列数据或 null
      var obj = command.ExecuteScalar();
      
      //取消
      command.Cancel();
      
      //异步执行
      command.ExecuteReaderAsync();
      command.ExecuteNonQueryAsync();
      command.ExecuteScalarAsync();
      
      
    3. 添加参数

      SqliteCommand command = connection.CreateCommand();
      //在SQL语句中使用key替代值,其中key 前需添加 :、@或$作为前缀
      command.CommandText = "INSERT INTO table (col1,col2,col3) VALUES ($key1,:key2,@key3);";
      command.Parameters.AddWithValue("$key1", 1);
      command.Parameters.AddWithValue(":key2", "value2");
      command.Parameters.Add(new SqliteParameter("@key3","value3"));
      //执行并取得结果
      SqliteDataReader reader = command.ExecuteReader();
      
    4. 执行事务

      using (var command = connection.CreateCommand())
      //开始事务
      using (var transaction = connection.BeginTransaction())
      {
           try
          {
               //执行数据库操作
               command.CommandText = "INSERT INTO table (col1,col2,col3) VALUES ('value1','value2','value3')";
               command.ExecuteNonQuery();
               command.CommandText = "SELECT * FROM table";
               SqliteDataReader reader = command.ExecuteReader();  
               reader.Close();
               //提交  
               transaction.Commit();
           }
           catch(SqliteException e)
           {
               //回滚  
               transaction.Rollback();
              }
      }
      

    SqliteDataReader

    1. 读取结果

      SqliteDataReader reader = command.ExecuteReader(); 
      //若一次执行多条 SQL 语句返回多组结果,使用 NextResult 到下一组
      While(reader.NextResult())
      {
           //遍历该组结果每一行数据
           While(reader.Read())
           {
                   //获取该行列数
                   int count = reader.FieldCount;
                   //获取第一列数据
                   var obj = reader[0];
                   //获取指定列数据
                   var obj = reader["colum1"];
                   //获取第二列数据并以int类型返回
                   int result = reader.GetInt32(2);
           }
      }
      
      //使用完需关闭reader,否则同一个 SqliteCommand 对象的下次查询会出问题
      reader.Close();
      //或使用 using 包裹 SqliteDataReader  
      using(SqliteDataReader reader = command.ExecuteReader()){
          
      }
      

    疑问

    1. Android Connection 要求"Data Source="替换为"URI=file:"

      没换也正常

    SqliteHelper

    SqliteHelper 为我封装的数据库操作工具,实现了部分基本的数据库快捷指令和数据库操作队列功能

    该工具已加入工具包 GRUnityTool文档

    SqliteHelper 对 Mono.Data.Sqlite 中的 SqliteCommand 进行扩展,使 SqliteCommand 对象可直接快捷调用增删改查等操作

    SqliteHelperQueue 通过使用 TaskQueue 创建串行队列,将通过 SqliteHelperQueue 调用的数据库操作放入同一队列中,保证数据库的线程安全

    相关文章

      网友评论

        本文标题:Unity工具—Mono.Data.Sqlite 使用

        本文链接:https://www.haomeiwen.com/subject/rycgdhtx.html