在用unity做开发时,需要使用sqlite作为数据库,于是百度,方法基本一致
1 Assets 中 建立文件夹 Plugins
并且导入以下几个dll
Mono.Data.Sqlite.dll
sqlite3.dll
System.Data.dll
2 代码实现
代码可以参考 xuanyusong大大 http://www.xuanyusong.com/archives/831
但是在运行时却出现了如下的问题
错误信息1
System.DllNotFoundException: Assets/Plugins/sqlite3.dll
at (wrapper managed-to-native) Mono.Data.Sqlite.UnsafeNativeMethods:sqlite3_open_v2 (byte[],intptr&,int,intptr)
at Mono.Data.Sqlite.SQLite3.Open (System.String strFilename, SQLiteOpenFlagsEnum flags, Int32 maxPoolSize, Boolean usePool) [0x00000] in <filename unknown>:0
at Mono.Data.Sqlite.SqliteConnection.Open () [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteConnection:Open ()
错误信息2
Failed to load 'Assets/Plugins/sqlite3.dll', expected 64 bit architecture (IMAGE_FILE_MACHINE_AMD64), but was 0x014c.
Mono.Data.Sqlite.SQLite3:Open(String, SQLiteOpenFlagsEnum, Int32, Boolean)
Mono.Data.Sqlite.SQLite3:Open(String, SQLiteOpenFlagsEnum, Int32, Boolean)
Mono.Data.Sqlite.SqliteConnection:Open()
奇怪的是,我的unity最初只是显示 错误信息1 一度导致我找不到问题的原因。后来实在没办法,重启电脑,再次运行时才有了 错误提示2
才找到解决方案。
解决方法 下载一个64位的 sqlite3
此处提供代码以及 dll下载
链接:http://pan.baidu.com/s/1pJvG6Or 密码:6d2r
我的开发环境
unity5.0 win7 64位
-------------------------
继续更新
接上部分,PC上的unity可以顺利读取sqlite数据库之后,进一步尝试在android上读取。 同样也遇到了问题 ,无法读出数据
【思路】
因为unity中的文件不能直接转到android中,所以我们需要copy db到相应的位置才能读取
1) 放入db文件
如果是将数据库文件保存到 Plugins-》Android-》assets 中,你会发现,apk打包以后,数据库文件根本找不到了~(将apk改成rar解压变可以看到文件结构)
解决方法是建立 assets->>StreamingAssets 这个文件,将db放入,这样,生成apk以后db文件就会在 assets中看到。
真机测试db文件的地址是在 data/app/com.test.da-1.apk!/assets/test.db
而我们需要将db放到 data/data/com.test.da/files/test.db 中 (第三方数据库拷贝至Android才可以找到)
2) 复制db文件到可以读取的位置
需要用到www的方式copy
3)读取数据库
此处有一个坑,android上读取sqlite 需要一个 名为 libsqlite3.so 放入到 Assets--》--Plugins-》Android 中 不然无法读取文件。
所以,在android上顺利读取,至少需要 4个文件
Mono.Data.Sqlite.dll
sqlite3.dll
System.Data.dll
libsqlite3.so
参考网站 http://forum.unity3d.com/threads/unity-3d-android-sqlite-examples.114660/
代码相关
//如果运行在编辑器中 #if UNITY_EDITOR //通过路径找到第三方数据库 appDBPath = Application.dataPath + "/Plugins/Android/assets/" + "test.db"; DbAccess db = new DbAccess("URI=file:" + appDBPath); //如果运行在Android设备中 #elif UNITY_ANDROID //将第三方数据库拷贝至Android可找到的地方 appDBPath = Application.persistentDataPath + "/" + "test.db"; //如果已知路径没有地方放数据库,那么我们从Unity中拷贝 if(!File.Exists(appDBPath)) { //用www先从Unity中下载到数据库 WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets/" + "test.db"); bool boo=true; while(boo) { if(loadDB.isDone) { //拷贝至规定的地方 File.WriteAllBytes(appDBPath, loadDB.bytes); boo =false; } } } //在这里重新得到db对象。 DbAccess db = new DbAccess("URI=file:" + appDBPath); #endif
对于IOS的,遇到了再更新~