android sqlite封装_Unity工具—Mono.Data.Sqlite 使用

为实现 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,架构根据版本选择

v2-a1c3259d35bee4a758d4ff29e4b4ff54_b.jpg

Windows 环境配置

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

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

v2-078bb3a01aa305a42758d14d69472df3_b.jpg

疑问

  1. System.Data.dll 没用到

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

  1. 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 调用的数据库操作放入同一队列中,保证数据库的线程安全

一个简单的基于AndroidSqlite数据库的操作封装,它有如下的好处:便捷地创建表和增添表字段灵活的数据类型处理通过操作对象来insert或者update表记录支持多种查询方式,支持多表自定义的复杂查询,支持分页查询支持事务快速开始:    1. 设计表:@Table(name="t_user") public class UserModel {     @Table.Column(name="user_id",type=Column.TYPE_INTEGER,isPrimaryKey=true)     public Integer userId;     @Table.Column(name="user_name",type=Column.TYPE_STRING,isNull=false)     public String userName;     @Table.Column(name="born_date",type=Column.TYPE_TIMESTAMP)     public Date bornDate;     @Table.Column(name="pictrue",type=Column.TYPE_BLOB)     public byte[] pictrue;     @Table.Column(name="is_login",type=Column.TYPE_BOOLEAN)     public Boolean isLogin;     @Table.Column(name="weight",type=Column.TYPE_DOUBLE)     public Double weight; }2. 初始化对象:SQLiteDatabase db = context.openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); DbSqlite dbSqlite = new DbSqlite(db); IBaseDao userDAO = DaoFactory.createGenericDao(dbSqlite, UserModel.class);3. 创建表:userDAO.createTable(); 4. Insert 记录:UserModel user = new UserModel(); user.userName = "darcy"; user.isLogin = true; user.weight = 60.5; user.bornDate = new Date(); byte[] picture = {0x1,0x2,0x3,0x4}; user.pictrue = picture; userDAO.insert(user);5. Update 记录:UserModel user = new UserModel(); user.weight = 88.0; userDAO.update(user, "user_name=?", "darcy");6. 查询://单条结果查询 UserModel user = userDAO.queryFirstRecord("user_name=?", "darcy"); //一般查询 List userList = userDAO.query("user_name=? and weight > ?", "darcy" , "60"); //分页查询 PagingList pagingList = userDAO.pagingQuery(null, null, 1, 3);7. 事务支持:DBTransaction.transact(mDb, new DBTransaction.DBTransactionInterface() {         @Override         public void onTransact() {             // to do                 } };8. 更新表(目前只支持添加字段)@Table(name="t_user" , version=2) //修改表版本 public class UserModel {     //members above...     //new columns     @Table.Column(name="new_column_1",type=Column.TYPE_INTEGER)     public Integer newColumn;     @Table.Column(name="new_column_2",type=Column.TYPE_INTEGER)     public Integer newColumn2; } userDAO.updateTable();缺点和不足:还没支持多对一或者一多的关系没支持联合主键没支持表的外键设计其他...实例:SqliteLookup(Android内查看Sqlite数据库利器): https://github.com/YeDaxia/SqliteLookup 标签:SQLiteUtils
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值