相信有很多同学在使用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的使用,方便调试和查看数据库内容以及工程中自己写的测试代码了,就不多说了。
遇到问题再继续更新学习!