Unity3D使用SQLite——Android应用开发时问题的解决办法

来源:互联网 发布:bms核心算法 编辑:程序博客网 时间:2024/06/18 17:59

相信有很多同学在使用Unity3D开发Android应用的时候都会使用到SQLite本地数据库,但是也肯定会遇到种种问题,在网上一顿狂搜,说多了都是泪。下面我直接进入正题说明一下我在使用Unity时遇见的几点问题和解决办法。

一、PC端小问题

首先我是在PC端进行Unity测试SQLite的使用,按照我转发的这篇博客一步步进行的, http://blog.csdn.net/perseverancep/article/details/72898486。在这里我就遇见了第一个问题,虽然不是在开发Android应用时遇到的,但是也有收获,解决办法进入上面的博客去查看。

二、第一个异常

下面我按照上面博客的内容尝试着进行Andoird的SQLite调试,在查看LOG时,出现了下面的错误:

 Unable to find sqlite3 

Unity                                     : InvalidOperationException: Database is not open 
Unity                                     :   at Mono.Data.Sqlite.SqliteCommand.InitializeForReader () [0x00000] in <filename unknown>:0  
Unity                                     :   at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (CommandBehavior behavior) [0x00000] in <filename unknown>:0  
Unity                                     :   at Mono.Data.Sqlite.SqliteCommand.ExecuteReader () [0x00000] in <filename unknown>:0  
Unity                                     :   at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteCommand:ExecuteReader ()  Unity                                     :   at SQLiteHelper.ExecuteQuery (System.String queryString) [0x00000] in <filename unknown>:0  
Unity                                     :   at SQLiteHelper.ReadFullTable (System.String tableName) [0x00000] in <filename unknown>:0  
Unity                                     :   at SQLiteHelper.InsertValues (System.String tableName, System.String[] values) [0x00000] in <filename unknown>:0  
Unity                                     :   at DataBaseDAL.WifiDataDAL.InsertWifiData (System.String bssid, System.String ssid, System.String password) [0x00000] in <filename unknown>:0  
Unity                                     :   at WifiPanel+<ConnectingWifi>c__Iterator1.MoveNext () [0x00000] in <filename unknown>:0  
Unity                                     :   at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnu 

于是各种查询,知道需要下载一个libsqlite.so库文件放,放到Unity工程自己建的/Assets/Plugins/Android文件夹中

三、第二个自己的问题

先贴一段代码:

public SQLiteHelper(string connectionString){try{//构造数据库连接dbConnection=new SqliteConnection(connectionString);//打开数据库dbConnection.Open();}catch(Exception e){Debug.Log(e.Message);}}

public WifiDataDAL(){//创建名为sqlite4unity的数据库,存在数据库不创建直接连接Debug.Log("开始初始化");sql = new SQLiteHelper("URI=file:"+Application.persistentDataPath+"/WifiData.db");if (sql == null) {Debug.Log ("初始化失败");} else {sql.CreateTable ("wifidata2",new string[]{"bid","id","pas"},new string[]{"TEXT","TEXT","TEXT"});}}

问题说明:

我一直以为.db数据库文件是我通过SQLiteStudio创建好后放到Unity工程中的Assets文件夹就可以了。我上面的代码是连接数据库后,创建一个名字叫做wifidata2的表。然后我使用SQLiteStudio加载 WifiData.db数据库文件,并没有看到刚刚建的表,顿时心里一凉。

问题解决:



后来知道,WifiData.db文件其实并不是我放在Unity工程里的Assets文件夹的文件,执行上面的代码也没报错,但是就是没看到我创建的表格。于是就使用adb命令(Android),adb shell 进入设备的根目录,再用linux指令find -name WifiData.db,发现了这个文件。终于知道在执行上面的代码后,在Android应用相应的目录又建立了一个新的名字叫做WifiData.db的数据库文件,于是用运行cmd,pull /路径/文件名 . 把文件拉出来用SQLiteStudio打开数据库文件就看到了刚刚创建的表格。

注:我也是Android新手,遇到这个问题也是捉急啊。查看的.db数据库文件根本不是同一个文件,是两个不同路径下的文件。

四、数据写入时的异常

先贴源码(遇到异常)

public void InsertWifiData(string bssid,string ssid,string password){Debug.Log ("进到数据库了");sql.InsertValues("wifidata2",new string[]{bssid,ssid,password});}

WifiDataDAL.Instance.InsertWifiData(m_bssid,m_ssid,m_password);

上面的源码是向表格中插入一条数据,但是查看Log出现下面的错误:

Unity   

SqliteException: SQLite error 

unrecognized token: "5c" 

at Mono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection cnn, System.String strSql, Mono.Data.Sqlite.SqliteStatement previous, UInt32 timeoutMS, System.String& strRemain) [0x00000] in <filename unknown>:0  

at Mono.Data.Sqlite.SqliteCommand.BuildNextCommand () [0x00000] in <filename unknown>:0  


解决办法:

更改后的源码

WifiDataDAL.Instance.InsertWifiData("'"+m_bssid+"'","'"+m_ssid+"'","'"+m_password+"'");

再每个字符串要加上单引号,我数据库的字段属性是VARCHAR。SQLite的单引号是转义字符。执行上面的代码我的数据成功插入数据库。


小结:

在Unity里面使用SQLite应用到Android时记住dll文件不能少,Mono.Data、Mono.Data.Sqlite、System.Data这三个文件放到/Assets/Plugins文件夹下,并且libsqlite.so文件不能少,放到/Assets/Plugins/Android文件夹下。


libsqlite.so放到上面图中的Android文件夹中。这些文件就可以了, http://download.csdn.net/detail/perseverancep/9875217

还有注意的就是adb pull和push的使用,方便调试和查看数据库内容以及工程中自己写的测试代码了,就不多说了。

遇到问题再继续更新学习!



阅读全文
0 0