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

相信有很多同学在使用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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值