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, 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的,遇到了再更新~




你可能感兴趣的:(sqlite,unity,unity使用sqlite报错,unity数据库)