Unity在Android中接入SQLite数据库
如题,一个新的尝试
第一次参与写一个安卓项目,第一次使用Unity和Android Studio,第一次学习及编写C#脚本,第一次使用SQLite Manager……
这个项目陆陆续续写了快一个月了,终于收尾了,记录一个踩坑最多、印象最深的板块
Android Studio 连接超时
改URL,改成阿里云的镜像
在Gradle目录下的build.gradle中Google()和jcenter()中间增加
1
maven{ url ‘http://maven.aliyun.com/nexus/content/groups/public/’}
当时还修改了Project Structure的一些Module属性,比如SDK版本、build Tool版本等,不知道这个有没有影响
创建Unity-安卓工程的密钥文件
unity-project setting-player里创建密钥,保存到特定的文件夹里
创建完密钥之后,在下面project Key选择刚才新建的密钥并且填写密码
cmd打开jdk所在的bin文件夹,或者通过配置java/jdk
的环境变量再直接cmd
1 | keytool -genkey -alias 秘钥库名称 -keyalg RSA -validity 有效时间 -keystore 秘钥库文件名 |
在bin文件生成testuse
文件,将其剪切到刚刚创建秘钥的文件夹里
安卓项目调用java脚本
新建一个AS项目,专门用来调试java脚本
切换到Android栏,在app文件夹上创建一个新的module
切换到project时,就可以看到刚刚新建的module
然后在module的
src/main/java/com.example.模块名
的文件夹里新建一个Java类文件在这个Java文件里写静态方法
写完方法后,右键文件找到Show in Explorer,就在文件夹中显示这个java文件,复制到unity的project里Assets下新建的
Plugins/libs
文件夹
SQLite Manager
我在Google拓展里用了两个插件,一个是原本的”SQLite Manager”,另一个是”适用于Google Chrome的SQLite Manager”,由于后者的帮助文档我打不开,所以我是结合着两个插件摸索出SQLite语法的。
这就要说说很奇怪的Google SQLite Manager了,它建表有模板,但是它建不成表,它会说无法识别”CREATE”,改过好多次都不行,遇到困难睡大觉
转战SQLite Manager,同样的语法,怎么人家就建出来了,Google SQLite Manager你看看人家
Unity使用SQLite数据库
- dll文件和so文件
针对sqlite3:①Mono.Data.Sqlite.dll、②sqlite3.dll
针对发布Android平台:③System.Data.dll、④libsqlite3.so
在
Asset/Plugins
里加入三个dll,其中①③可在Unity编辑器文件夹\Editor\Data\MonoBleedingEdge\lib\mono\unityjit
里复制过去,②在SQLite官网下载,找Precompiled Binaries里相应电脑配置的文件下载,注意从不是Android版本在
Asset/Plugins/
里创建Android
文件夹,把libsqlite3.so放其中
dll和so的配置
Mono.Data.Sqlite.dll 和 sqlite3.dll:
Any PlatformSystem.Data.dll 和 libsqlite3.so:
Android都只勾选Android,因为PC环境不需要,勾选全平台的话会报错
libsqlite.so文件还要在下面的Platform settings选择ARMv7
更改完记得应用插件
Load at Startup将建好的数据库文件放入Asset/StreamingAssets里
C# 使用命名空间
using Mono.Data.Sqlite
写代码即可
注意Android端需要拷贝数据库文件
在我写完调用数据库代码并且真机调试时,我发现在unity上可以正常使用的登录系统,在安卓端上无法正常运行😢
这其实是因为:
移动端是不能读写StreamingAssets
路径下的文件的,但是会打包到安装包中,所以我们要把StreamingAssets中的数据库拷贝到持久化PersistentDataPath
路径中
看到说可以用WWW类复制数据库文件,好的开始学习
写完脚本之后,unity给我报错说WWW已经过期了,建议使用WebRequest😅
好的开始重新学习
语法又被弃用了,无所谓,这个简单,换一下就好了
C# —跟SQLite数据库相关部分
using Mono.Data.Sqlite; 开头声明使用模块
主要使用的数据库三个类
- SqliteConnection:创建与特定数据库的连接
- SqliteCommand:针对数据库执行SQL语句
- SqliteDataReader:从数据源读取数据流
连接数据库
1
2
3
4
5
6
7
8
9
10
11
12
13private SqliteConnection con;
private SqliteCommand command;
private void DataBaseInit()
{
//数据库路径字符串,注意最后的文件要改成自己的数据库文件名
path = "Data Source = " + Application.streamingAssetsPath + "/users.db";
//实例化连接对象
con = new SqliteConnection(path);
//打开数据库文件
con.Open();
//创建指令对象
command = con.CreateCommand();
}使用数据库指令
1
2//command.CommandText = "SQL指令"
command.CommandText = "Select * From users Where name='"+ UserInput.text+"'";接受、更新数据
ExecuteScalar()
只返回一个值,主要用来接收数据,如返回的密码ExecuteNonQuery()
主要用来更新数据,通常使于执行Update、Insert和Delete语句
存档、删档
1
2PlayerPrefs.SetString("数据名", 数据);
PlayerPrefs.DeleteAll();WebRequest
using UnityEngine.Networking;
创建连接
1
2var uri = new System.Uri(地址);
UnityWebRequest www =UnityWebRequest.Get(uri);获取传输的文本
1
www.downloadHandler.text
打包安卓apk文件
在打包之前可以把手机跟电脑用数据线连上,不然就会报这样的错误😅
用的小米手机,一开始找不到手机里的开发者模式,没关系我会变魔术
设置-我的设备-全部参数:点击MIUI五次就可以进入开发者模式,设置里也会多了开发者模式选项一定要打开USB调试还有USB安装,不然会给你拦截😮
之后打开Build Setting,先把Run Device刷新之后改成自己的安卓设备,在下方找Export选择一个安装调试文件的路径,
注意这个路径不要含有中文,等安装好之后就可以点击旁边的Bulid and Run安装到手机里了
很奇怪的是,这个打包我就成功了一次之后,想着做完修改了删掉apk再重新打包的时候,unity显示的是打包成功,安卓设备上也显示连接上问我是否安装,但是apk却安装不到我的手机上😢
无所谓,我会换一台安卓设备测试的时候,没有删除第一次打包的再安装一个新的也是OK的,
尝试让其他兄弟给我打个包让我试试装装,就有了这段报错,应该是因为我们这是个协作项目,我在unity的签名跟给我打这个包的兄弟不同,所以失败。
Unity其他报错成就收集栏目
笑死了,对于刚接触unity的新手来说,就是见一个报错一个新鲜,跟成就收集似的🧐
报错太多了,我也筛一筛,像什么脚本语法错误之类的我是没脸放上来的🤥,记一些显得比较有含金量或者比较有意思的报错。
Loading assembly failed: “Assets/Plugins/Mono.Data.Sqlite.dll” reason: File does not contain a valid CIL image
应该是导入的dll和unity内部编译器的target版本应该有差异,从网上下载dll文件也仅仅是适用于分享者的文件,最好还是按照上面讲过的路径,Unity编辑器下的Editor\Data\MonoBleedingEdge\lib\mono\unityjit
SqliteException: SQLite error no such table
这个问题应该是C#写数据库路径文件名没写对,或者是streamingAsset文件夹里没有数据库文件
1 | path = "Data Source = " + Application.streamingAssetsPath + "/unity_users.db"; |
连踩两坑😶
一次是文件后缀名写成了.sqlite,导致后来运行脚本的时候,Unity给我新建了一个unity_users.sqlite文件,当时我以为是Unity给我自动配置的文件所以没有管😓,
我反思,不该不管的第二次是改对了路径之后运行,给我报我的文件不是数据库的错误(
别问为什么没有截图,问就是忘了)
是的,我给忘记了,我只接触过MySQL,所以当时用的就是MySQL写的数据库文件,但是我用的SQLite接的Unity,(其实在报错之前我都还觉得MySQL和SQLite没什么区别)所以无非两个选择,一个是重新写C#脚本,改用MySQL接,另一个是写一个SQLite数据库文件。当然选择容易实现一点的,不就是学一下用SQLite Manager😴。
Sqlite Error: SQLite error no such column
在插入数据到数据库时,注意Varchar类型的,在传入数据的时候要插入引号
1 | "'" + 你要插入的数据 + "'" |
error CS0234:The type or namespace name“xxx“does not exist in the namespace“yyy“
打包的时候报的错,我记得我当时吧Project Settings/Player/Android/Other Settings/Configuration/Api Compatibility Level*
的.Net
文件换成另外一个就好了
新奇的乱码错误(?)
这么清新脱俗的报错一定不是我这种刚接触unity的废物能看懂的对吧,不记得改了哪步导致的,无所谓,我会选择不保存然后重开😴