Posted on 

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选择刚才新建的密钥并且填写密码

img

cmd打开jdk所在的bin文件夹,或者通过配置java/jdk的环境变量再直接cmd

1
keytool -genkey -alias 秘钥库名称 -keyalg RSA -validity 有效时间 -keystore 秘钥库文件名
img

在bin文件生成testuse文件,将其剪切到刚刚创建秘钥的文件夹里

安卓项目调用java脚本

  1. 新建一个AS项目,专门用来调试java脚本

    img
  2. 切换到Android栏,在app文件夹上创建一个新的module

    img
  3. 切换到project时,就可以看到刚刚新建的module

    然后在module的src/main/java/com.example.模块名的文件夹里新建一个Java类文件

    img
  4. 在这个Java文件里写静态方法

  5. 写完方法后,右键文件找到Show in Explorer,就在文件夹中显示这个java文件,复制到unity的project里Assets下新建的Plugins/libs文件夹

    img

SQLite Manager

我在Google拓展里用了两个插件,一个是原本的”SQLite Manager”,另一个是”适用于Google Chrome的SQLite Manager”,由于后者的帮助文档我打不开,所以我是结合着两个插件摸索出SQLite语法的。

这就要说说很奇怪的Google SQLite Manager了,它建表有模板,但是它建不成表,它会说无法识别”CREATE”,改过好多次都不行,遇到困难睡大觉

转战SQLite Manager,同样的语法,怎么人家就建出来了,Google SQLite Manager你看看人家

Unity使用SQLite数据库

  1. 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放其中

  1. dll和so的配置

    • Mono.Data.Sqlite.dll 和 sqlite3.dll:

      Any Platform

    • System.Data.dll 和 libsqlite3.so:

      Android

      都只勾选Android,因为PC环境不需要,勾选全平台的话会报错

      libsqlite.so文件还要在下面的Platform settings选择ARMv7

    更改完记得应用插件

    Load at Startup

  2. 将建好的数据库文件放入Asset/StreamingAssets里

  3. 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
    13
    private 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
    2
    PlayerPrefs.SetString("数据名", 数据);
    PlayerPrefs.DeleteAll();
  • WebRequest

    using UnityEngine.Networking;

    • 创建连接

      1
      2
      var 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

img

应该是导入的dll和unity内部编译器的target版本应该有差异,从网上下载dll文件也仅仅是适用于分享者的文件,最好还是按照上面讲过的路径,Unity编辑器下的Editor\Data\MonoBleedingEdge\lib\mono\unityjit

SqliteException: SQLite error no such table

img

这个问题应该是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的废物能看懂的对吧,不记得改了哪步导致的,无所谓,我会选择不保存然后重开😴

img



Copyright © 2022 - 2023 BlindArbiter

Powered by Hexo | Theme - Stellar