unity 使用 sqlite 数据库遇到的问题 unity android 使用sqlite

在用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,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


参考网站 @L_403_1@


代码相关

//如果运行在编辑器中
#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的,遇到了再更新~

相关文章

安装 在Windows上安装SQLite。 访问官网下载下Precompliled Binaries for Windows的两个压缩包。 创建s...
一、安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Windows下的包下...
实例: 会员信息管理 功能:1.查看数据库 2.清空数据库 3.增加会员 4.删除会员 5.更新会员 6.查找会员  ...
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整...