前言

最近做的一个新项目,需要处理大量数据和动态图表展示。

并且结合跨平台使用的问题,考虑再三,计划使用Unity3D+SQLite进行开发。

因为跨平台的需求,先忽略UnityStore的收费SQLite插件。在GitHub上找到了“SQLiteUnityKit”。

SQLiteUnityKit 全平台支持,包括iOS, Android, MAC 还有 Windows。

亲测windows、MAC和Android都可正常使用。IOS目前没有开发账号,所以作罢。android测试成功

准备工作

SQLite安装&创建测试用数据库安装SQLite

可以只安装命令行环境,但是安装可视化客户端可以更方便的使用数据库。

下面是我推荐的客户端,DB Browser。轻巧、跨平台,使用方便。

推荐客户端DB Browser

下载好后正常安装即可。

创建数据库

打开DB Browser。

点击“新建数据库”按钮新建数据库,命名为test.db。

随后出现“编辑表定义”窗口。

表名称设为“example”

点击“添加字段”按钮三次,添加三个字段。

第一个:名称为“id”,类型为“INTEGER”,勾选PK(主键)和AI(自动增值)用作每个数据的唯一索引。

后面两个字段不勾选选框,只改名称和类型。

第二个:名称为“name”,类型为“TEXT”。

第三个:名称“dummy”,类型为“INTEGER”。

点击“OK”按钮完成“test.db”数据库的创建。

可以顺便给里面添加一两行数据作测试用。

或者直接命令行运行SQLite

创建文件

$sqlite3 test.db SQLite version 3.19.4.2 2017-08-18 19:28:12 Enter ".help" for usage hints. sqlite>

表定义

CREATE TABLE `example` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT, `dummy` INTEGER );如果希望用其它方式安装SQLite和创建测试数据库,或者学习sqlite语法。可在网上查找,资料很多。

SQLiteUnityKit 下载

不过SQLiteUnityKit 并未添加windows支持的”SQLite3.dll”文件。

所以需要windows下使用则自己下一个:

请根据自己的unity是x64还是x86酌情下载对应dll。

准备好这些之后…

开工

流程

对unity的版本要求不高,直接用手头的2017.2。新建Unity项目。

将之前下载的SQLiteUnityKit 解压放入项目的“Assets”文件夹内。

mac和ios不用进行额外操作,但是windows和android需要下面操作:

windows:

将之前下载的”SQLite3.dll”文件放入”Assets/Plugins“文件夹内即可。

android:

将SQLiteUnityKit 里面的”libsqlite3.so”文件拷贝到”Assets/Plugins/Android”文件夹内即可。

将之前创建的测试用数据库“test.db”放入“Assets/StreamingAssets”文件夹内。

创建脚本“SQLiteTest.cs”,写入下面代码:

using UnityEngine;

public class SQLiteTest : MonoBehaviour{

public SqliteDatabase sqlDB;

// Use this for initialization

void Start() {

//打开测试数据库

sqlDB = new SqliteDatabase("test.db");

//添加数据

sqlDB.ExecuteNonQuery("insert into example (name,dummy) values('test name', -123)");

print("添加数据完毕");

PrintAllData();

//根据id删除最后添加的数据

sqlDB.ExecuteNonQuery("DELETE FROM example WHERE id = (SELECT MAX(id) FROM example)");

print("删除数据完毕");

PrintAllData();

}

//控制台打印数据

void PrintAllData()

{

//读取example表中所有数据

DataTable dt = sqlDB.ExecuteQuery("SELECT * FROM example");

//提取每行数据,遍历打印

string name;

int dummy;

foreach (DataRow dr in dt.Rows)

{

name = (string)dr["name"];

dummy = (int)dr["dummy"];

print("name:" + name);

print("dummy:" + dummy);

//print("id:" + (int)dr["id"]);

}

}

}

将脚本附加在场景的camera中,运行后若在控制台看结果则成功。

发现的问题与解决

中文数据写入时报错:SqliteException: near "xxxx": syntax error排查问题原因

上面代码,name字段中写入的是英文“test name”,没有问题。

但是如果写入中文,比如”中文测试”,结果却报错:

SqliteException: near "xxxx": syntax error

经过排查,终于发现问题在SQLiteUnityKit的“SqliteDatabase.cs”脚本中。

其函数IntPtr Prepare(string query)在调用SQLite的“sqlite3_prepare_v2”函数时出了错。

”sqlite3_prepare_v2“第二个参数是query,第三个参数是query的长度。然而中文的string长度并不是真正的字节长度,一个中文字符根据编码不同,会占用2到4个字节。

因此SQLite获得的字符串长度不够,就会报错。

解决方法

让”sqlite3_prepare_v2“函数获得正确的字节长度。

SQLite默认的字符格式为UTF8,因此将传入的query用UTF8格式解析成为字节数组。字节数组的长度才是正确长度。

不过这样并未结束,由于unity的cs脚本默认并不是UTF8编码格式,因此需要将写入数据用的“DataTable.cs”脚本改为UTF8格式才能大功告成。将IntPtr Prepare(string query)函数替换:

private IntPtr Prepare (string query){

IntPtr stmHandle;

byte[] queryByts = System.Text.Encoding.UTF8.GetBytes(query);//正确字节长度

if (sqlite3_prepare_v2 (_connection, query, queryByts.Length, out stmHandle, IntPtr.Zero) != SQLITE_OK) {

IntPtr errorMsg = sqlite3_errmsg (_connection);

throw new SqliteException (Marshal.PtrToStringAnsi (errorMsg));

}

return stmHandle;

}

​ 2.将“DataTable.cs”脚本的编码改为UTF8格式:

​ 在VisualStudio和MnnoBehaviour的文件菜单都有“脚本另存为”选项。

​ 点开另存为后选择UTF8编码,覆盖原脚本保存即可。

项目分享

为方便在座(或,在站、在趟、在蹲)各位,不才 将示例项目给大家分享:

有任何疑问、交流或者请客吃饭玩游戏或者等等都可找我。

原文链接:

mono for android mysql_unity跨平台sqlite使用教程相关推荐

  1. Xamarin Mono For Android

    Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android.IOS工具) Xamarin是由Miguel de Icaza成立的一家新的独立公司, ...

  2. Xamarin Mono For Android 4.10.01068 完整离线安装破解版(C#开发Android、IOS工具)

    Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Micro ...

  3. Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android、IOS工具)

    Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Micro ...

  4. C#开发Android应用实战——使用Mono for Android和.NET/C#

    <C#开发Android应用实战--使用Mono for Android和.NET/C#> 基本信息 原书名:Professional AndroidTM Programming with ...

  5. Android数据库 之 SQLite数据库

    一.关系型数据库SQLIte 每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的.与操作系统无关的SQL数据库-SQLite.SQLite第一个Alpha版本诞生于20 ...

  6. ANDROID开发之SQLite详解

    SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLit ...

  7. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一) 平台简单介绍 令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操作系统, ...

  8. mono for android定义,2.1.3 使用Mono for Android的原因

    2.1.3  使用Mono for Android的原因 假设Android平台有一个以Java为基础的公开的开发堆栈作为可视化开发环境,那么就有理由要问为什么还需要Mono for Android. ...

  9. 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解

    Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...

最新文章

  1. Nature综述:真菌的多样性:真菌的高通量测序及鉴定
  2. httpruner学习--安装和认识
  3. Python代码运行助手
  4. 获取VirtualBox COM对象失败,Unable to start the virtual device
  5. Eclipse java项目转换为web项目
  6. Java中 String的反转
  7. UVA11255 Necklace Burnside、组合
  8. spring 的配置 beanpropertyname属性
  9. Install stardict on Ubuntu
  10. window版docker安装及配置
  11. LocalDateTime - Java处理日期和时间
  12. HDFS学习 Java连接hadoop
  13. 华为云PB级数据库GaussDB(for Redis)解析第二期:Redis消息队列Stream的应用探讨
  14. Gin 快速入门知识点总结(奇淼)
  15. Linux 命令(69)—— objcopy 命令
  16. 小熊派鸿蒙开发版,小熊派IoT开发板系列教程合集
  17. 免费、无版权约束、可商用的优质图片素材网站合集
  18. 公众号采集文章插件下载-支持各大网站自动采集发布的公众号插件
  19. Opencv求取连通区域重心
  20. Thingworx自定义扩展开发(一)- 开发环境搭建、Extension Demo Coding

热门文章

  1. replace c语言,C中如何实现replace函数功能
  2. 【渝粤教育】21秋期末考试中国法律史10212k1
  3. 已处理证书链,但是在不受信任提供程序信任的根证书中终止
  4. Linux一个内存大页多大,Linux中的“大内存页”(hugepage)是个什么?
  5. 360Wifi2代在linux上安装使用 踩过的的坑和成功的途径 分享一下
  6. 计算差分方程的收敛点_时间序列分析第一章 差分方程
  7. 让书和背景分离/去除大区域中小的连通区域(python实现)
  8. 在HTML中表示表格的标签是,在html中,表格的标签是()。
  9. 石城天气预报软件测试,石城天气预报15天
  10. Tensorflow官网教程笔记(1)