首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之使用C#语言建立本地数据库(二十三)
2012
05-10

Unity3D研究院之使用C#语言建立本地数据库(二十三)

原文:http://forum.unity3d.com/threads/28500-SQLite-Class-Easier-Database-Stuff

原始文章主要是使用JavaScript语言建立本地数据库

以前在开发中一直使用IOS源生的数据库,通过传递消息的形式在与Unity3D中进行交互。本文我在详细说说如何使用C#语言来在MAC 操作系统下创建Unity本地数据库,我是C#控哇咔咔~~~

      首先你需要得到Mono.Data.Sqlite.dll 文件 与System.Data.dll文件。如果你在Mac 操作系统下使用Unity那么很悲剧,找不到这两个文件,至少我没能找到。后来我在Windows下的Unity安装路径中找到了它。为了方便大家我将这两个文件上传至网盘中,如果没有这两个文件的朋友请下载。

下载地址:http://vdisk.weibo.com/s/abG7k 

.zip文件下载完毕后直接解压,然后将Mono.Data.Sqlite.dll 文件 与System.Data.dll文件放在Unity工程中的Assets文件夹中。如下图所示,两个文件已经放置在Project视图当中。

 

Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 1

 

Ok ,我们编写C#脚本,原始文章没有Unity数据库更新与删除的方法,我在这里加上更新与删除的方法,方便大家开发时使用。因为其实Unity中更新与删除数据库也是个比较重要的功能。

注意:下面脚本不要绑定在任何游戏对象身上,大家无需把它当作脚本可以当作一个工具类来使用。

 

 

 

 

首先是创建本地数据库,我们创建C#脚本Test.cs直接绑定在摄像机中。

 

          运行游戏后,数据库对象会自动生成在项目的根目录中。查看数据库的软件我使用的是Navicat Premium,如果没有请大家下载,然后继续。如下图所示,数据库文件xuanyusong.db已经生成在项目的根目录中,接着我使用Navicat Premium软件将这个数据库打开。数据库的表名为momo 打开表后字段包含name、  qq  、email、  blog。都是我们在代码中创建的。

 

Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 2

(点击查看大图)

 

OK,我们继续。首先是插入数据,记得将编码修改成UTF-16 不然中文会乱码。

 

 

 

 

 接着是更新数据。UpdateInto是我新写的方法,接受更新多条数据。

 

然后是删除数据DELETE也是我封装的方法。

 

最后是查找数据。

 

注解1:这里的结构非常像安卓的数据库指针,然后while循环把每一条数据都取出来。 sqReader.Gerordinal()方法就是拿到对应列名称的数据。如下图所示,经过一些列的添加与删除的操作最后数据库的内容如下。

 

Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 3

 

         如下图所示,我使用Log也将数据库name 与 email的字段打印了出来。最后我在强调一点,我们在OnStart方法中db.CreateTable创建数据库表,如果重复创建系统会抛出错误。避免这个情况请保证你的数据库表只会被创建一次。祝大家学习愉快嘎嘎嘎~~~

Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 4

 

留言中看到有朋友说报错,那么MOMO将我的工程打包,提供下在地址

Unity 使用SQLite本地数据库的下载地址如下:http://vdisk.weibo.com/s/abGmB

 

 

如下图所示,请先在PlaySettings中修改Api Compatibility Level 改成.NET 2.0,如果不修改会报错

注意:Error building Player: Extracting referenced dlls failed. 

无论你编译任何平台都请修改一下这里, 留言中有朋友在编译PC平台中 因为没有修改这里导致无法编译成功。。

Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 5

IOS平台SQLite的使用:

 

         
然后需要修改Test.cs的脚本,在修改一下数据库保存的路径,我们将数据库放在沙盒当中。这样IOS中才可以读取数据库。

         下面开始打包成IOS版本,直接运行如下图所示,已经在XCODE的控制台中将字符串信息打印出来。目前我不知道如何读取中文,但是可以确定的是中文信息已经写入数据库中。不信大家可以打开沙盒看看。


Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 6

 

Android平台SQLite的使用:

 

Android与IOS在使用SQLite数据库时有点区别,Android需要将第三方DLL放在Plugins当中。脚本也需要修改一下,先看看Test.cs的改动。

 如下图所示,Player Settings 请和我保持一致。

Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 7

值得庆幸的是在Android下读取数据库时正常的显示了中文。如下图所示,运行打包后的程序后在Eclipse的后台已经能看到数据库显示的中文与英文,呵呵。
Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 8
由于工程中需要一些DLL,所以我将工程的下载地址放出,请大家下载。
MAC平台下的使用:

 

请先下载原始版本 http://vdisk.weibo.com/s/abGmB
我们只需在原始版本之上进行修改即可。

 

修改Test.cs文件  ,请注意我在代码中标注的内容。

 


 

生成工程后,运行生成的mac程序,我们可以看到 数据已经取出来了。

 

Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 9
Windows平台SQLite的使用:

 

Windows平台下与Mac平台有点区别,废了老半天来找到问题所在。MOMO感谢在博客后面留言的朋友,因为没有你们的留言我也不会去研究MAC  Windows下如何使用 呵呵。

 

进入正题,还是先修改Test.cs文件

 


 

 

如下图所示打开Unity然后我们需要下载sqlite3.dll文件,接着将dll都放入Plugins文件夹中。不用担心 稍后我会把真个工程的下载地址贴出来其中包括所有的dll 。
Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 10
最后直接打包成Windows平台工程。双击运行.exe文件,如下图所示数据库的数据以及路径MOMO已经打印在屏幕当中啦。哇咔咔~ 然后xuanyusong.db文件就放在ddd_Date文件夹中,我已经用红圈标注出来了。ddd就是工程的名称,ddd_Date该文件夹是自动生成的。
Unity3D研究院之使用C#语言建立本地数据库(二十三) - 雨松MOMO程序研究院 - 11
(点击图片查看大图)
最后这个工程的下载地址,包括所有DLL以及代码MOMO感谢大家的支持。

 

 

最后祝大家学习愉快。

 

2013年5月6号补充

我发现留言中有很多朋友都问我  : SqliteException: SQLite errornear “″: syntax error 这样的错误。

这几天我抽时间看一下这个问题,出现这个问题应该是你需要在程序中载入第三方数据库,而不是自己创建数据库。

解决这个问题的办法其实很简单,当你程序发布以后。 windows下会生成 xx.exe 和 xx_Data文件夹,这时候你把你的第三方数据库拷贝进去就可以,因为我发现编辑模式下assets文件夹中的db文件打包生成windows的以后,这db文件不会完整的拷贝,在xx_Data文件夹中的db文件变成了0KB 。

 

在MAC OS 中也一样,unity也不会完整的拷贝。只需把数据库拷贝至 对应的路径下就可以。

 

如果你是在使用移动平台,可以参考   Unity3D研究院之在Unity中打开第三方数据库配合Android开发(三十二)

 

 

 

 

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 请问下 你在Windows 下面的Unity 连接数据库用的是32位的还是 64位的呢?? 我在win10系统下使用64位的Unity 貌似不能连接到 .accdb数据库。 有没有什么方法可以实现呢?

  2. public SqliteDataReader ExecuteQuery (string sqlQuery){dbCommand = dbConnection.CreateCommand ();dbCommand.CommandText = sqlQuery;reader = dbCommand.ExecuteReader ();return reader;}楼主,每执行一次sql操作,这里就执行一次,command 就 create 一次,会有内存浪费哎。把 dbCommand = dbConnection.CreateCommand () 放到SQLiteHelper()里面会好一些。

  3. 博主,我是新手,我在WebPlayer平台下出现这个编译错误:Internal compiler error. See the console log for more information. output was:Unhandled Exception: System.TypeLoadException: Could not load type ‘Mono.Data.Sqlite.SqliteStatement’ from assembly ‘Mono.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756’.麻烦帮忙解释一下,是不是WebPlayer平台下不支持使用Sqlite?

    • 更新或者删除数据后然后再读取还是原来数据,但是数据库内的已经更新了,运行一下untiy后数据才更新了,求雨凇大大帮帮忙

  4. 请问如何连接带密码的SQLITE,发现在C# FOR WINFROM很容易连接到带密码的SQLITE,在UNITY3D下使用MONO连接后有密码的,如何也连接不上,求帮助!

  5. 大神,问一下,如果要插入变量,像这样db.InsertInto(“表A”, new string[]{data}),data 是一个string类型变量,;data = “数据”,存入不了数据值,该怎么处理?

  6. 雨松大大,我用你的代码在Windows环境下运行的时候,在unity下没问题,但是导出来的时候,就只显示那个保存的路径,名字和邮箱都没显示,加Development Build之后显示是Database is not open,请问这是什么问题?

  7. 请问MOMO你的示例代码中定义的InsertInto方法是不是只能向数据库里写入字符型的数据啊,我尝试用整型没有用啊,这个方法是不是需要再改进下?

  8. 雨松大神,求救呀,我win7 64用你的工程报错不能用了呀,提示说:Failed to load ‘Assets/Plugins/sqlite3.dll’, expected 64 bit architecture (IMAGE_FILE_MACHINE_AMD64), but was IMAGE_FILE_MACHINE_I386.Mono.Data.Sqlite.SqliteConnection:Open()Mono.Data.Sqlite.SqliteConnection:Open()DbAccess:OpenDB(String) (at Assets/script/DbAccess.cs:36)DbAccess:.ctor(String) (at Assets/script/DbAccess.cs:21)Test:Start() (at Assets/script/Test.cs:26)我从系统考了这个splite3.dll替换页不行呀

  9. 您好,我根据这个讲解已经可以成功使用 SQLite 了。但是更新 Unity 到 5 之后,就不行了 提示 DllNotFoundException: sqlite3。请问您有遇到这样的情况吗?有没有什么解决方法呢?

  10. CloseSqlConnection();方法如其名,就是用来关闭数据流的,和删除DB文件是两个东西,我也没找到删除DB的方法呢。。。这个需求确实是存在的,比如测试时候创建了一个DB,再想创建正式的DB,之前的测试用的DB就不应该存在了

  11. 07-12 09:25:28.289: E/Unity(8235): Unable to find sqlite307-12 09:25:28.289: E/Unity(8235): Unable to find sqlite307-12 09:25:28.299: E/Unity(8235): Unable to find sqlite307-12 09:25:28.319: I/Unity(8235): System.DllNotFoundException: sqlite307-12 09:25:28.319: I/Unity(8235): at (wrapper managed-to-native) Mono.Data.Sqlite.UnsafeNativeMethods:sqlite3_open_v2 (byte[],intptr&,int,intptr)07-12 09:25:28.319: I/Unity(8235): at Mono.Data.Sqlite.SQLite3.Open (System.String strFilename, SQLiteOpenFlagsEnum flags, Int32 maxPoolSize, Boolean usePool) [0x00000] in :0 07-12 09:25:28.319: I/Unity(8235): at Mono.Data.Sqlite.SqliteConnection.Open () [0x00000] in :0 07-12 09:25:28.319: I/Unity(8235): at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteConnection:Open ()07-12 09:25:28.319: I/Unity(8235): at DbAccess.OpenDB (System.String connectionString) [0x00000] in :0 07-12 09:25:28.319: I/Unity(8235): 07-12 09:25:28.319: I/Unity(8235): (Filename: ./artifacts/AndroidManagedGenerated/UnityEngineDebug.cpp Line: 53)07-12 09:25:28.359: I/Unity(8235): InvalidOperationException: Database is not open07-12 09:25:28.359: I/Unity(8235): at Mono.Data.Sqlite.SqliteCommand.InitializeForReader () [0x00000] in :0 07-12 09:25:28.359: I/Unity(8235): at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (CommandBehavior behavior) [0x00000] in :0 07-12 09:25:28.359: I/Unity(8235): at Mono.Data.Sqlite.SqliteCommand.ExecuteReader () [0x00000] in :0 07-12 09:25:28.359: I/Unity(8235): at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteCommand:ExecuteReader ()07-12 09:25:28.359: I/Unity(8235): at DbAccess.ExecuteQuery (System.String sqlQuery) [0x00000] in :0 07-12 09:25:28.359: I/Unity(8235): at DbAccess.SelectWhere (System.String tableName, System.String[] items, System.String[] col, System.String[] operation, System.String[] values) [0x00000] in :0 07-12 09:25:28.359: I/Unity(8235): at test+c__Iterator7.MoveNext () [0x00000] in :0 07-12 09:25:28.359: I/Unity(8235): 07-12 09:25:28.359: I/Unity(8235): (Filename: Line: -1)雨松老师,您好,我是初学者,刚做unity连接sqlite连接,在Android真机上测试,但是总是报这个错误,可是我把所有的dll文件都已经拷贝到Plugins文件夹中了,电脑上测试连接成功,请问这是什么问题呢

  12. 雨松大神,我用sqlite在PC,MAC上测试输出一条数据都通过了。但是将项目编译到IOS中的时候遇到了一个问题:我已经打开数据库xuanyusong.db,但是没有找到它下面的一个表。SqliteException: SQLite errorno such table: CopyDialogue 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 :0 at Mono.Data.Sqlite.SqliteCommand.BuildNextCommand () 但是我用管理工具去查看数据库的时候,这个表确实存在。下面是源码: void Test(){ string dbName = “xuanyusong.db”; string tableName = “CopyDialogue”;#if UNITY_EDITOR string appDBPath = @”Data Source=” + Application.dataPath + “/” + dbName;#elif UNITY_IPHONE string appDBPath = @”Data Source=” + Application.persistentDataPath + “/” + dbName;#endif SqliteConnection dbConnection = new SqliteConnection(appDBPath); try{ dbConnection.Open(); Debug.Log(“Open db : ” + appDBPath); }catch(Exception e){ Debug.Log(“catch : ” + e.ToString()); } SqliteCommand dbCommand = dbConnection.CreateCommand(); string lineName = “id”; string strCommand = ” SELECT ” + lineName + ” FROM ” + tableName; dbCommand.CommandText = strCommand; Debug.Log(“CommandText : ” + strCommand); using(SqliteDataReader reader = dbCommand.ExecuteReader()){ while(reader.Read()){ temp = reader.GetInt32(reader.GetOrdinal(lineName)); Debug.Log(temp); mListIntTest.Add(temp); } reader.Close(); } dbConnection.Close(); }请MOMO帮我找一下原因,万谢!

  13. @雨松MOMO 我用你的代码 在线程中 操作 数据库的清空 表数据 和插入操作 第一次运行 正常,然后 再次 运行 就会 SqliteException: The database file is lockeddatabase is locked 。必须把Unity3d 关闭后 再重新打开 才会正常。请问 有什么解决方法没??

  14. Pingback: バーバリー ネクタイ 激安

  15. @雨松MOMO一般我们都会将数据载入表中,eq:public DataTable ExecuteDataTable(string sqlQuery) { SqliteDataReader dr = ExecuteQuery(sqlQuery); DataTable dt = new DataTable(); dt.Load(dr); return dt; }这个代码这windows上没有问题,但这mac上将数据载入表中就会报错,应该是跟dll有关系,网上找了好久都没解决方案,不止雨松老师有办法吗?报错信息:EntryPointNotFoundException: sqlite3_column_origin_nameMono.Data.Sqlite.SQLite3.ColumnOriginalName (Mono.Data.Sqlite.SqliteStatement stmt, Int32 index)

  16. DbAccess类的237行的query += ” AND ” + col[ i] + operation[ i] + “‘” + values[ 0] + “‘ “;这句最后那个参数应该是 values[ i] ,改改吧。

  17. at Mono.Data.Sqlite.SQLite3.Open (System.String strFilename, SQLiteOpenFlagsEnum flags, Int32 maxPoolSize, Boolean usePool) [0x00000] in :0 at Mono.Data.Sqlite.SqliteConnection.Open () [0x00000] in :0 (Filename: /Applications/buildAgent/work/7535de4ca26c26ac/Runtime/ExportGenerated/iPhonePlayer-armv7/UnityEngineDebug.cpp Line: 54)AssertMacros: queueEntry, file: /SourceCache/IOKitUser/IOKitUser-920.1.11/hid.subproj/IOHIDEventQueue.c, line: 512InvalidOperationException: Database is not open at Mono.Data.Sqlite.SqliteCommand.InitializeForReader () [0x00000] in :0 at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (CommandBehavior behavior) [0x00000] in :0 at Mono.Data.Sqlite.SqliteCommand.ExecuteReader () [0x00000] in :0 at DbAccess.ExecuteQuery (System.String sqlQuery) [0x00000] in :0 at DbAccess.CreateTable (System.String name, System.String[] col, System.String[] colType) [0x00000] in :0 at Test.Start () [0x00000] in :0 (Filename: Line: -1)手机后台Log

  18. Pingback: maillot de foot

  19. 你好,你的例子是运行游戏创建的数据库吧,可以读取发布游戏时候预先弄好的数据库不?不知道自己的文件放哪里才能生成出到application.datapath

  20. SqliteException: SQLite errornear “289187120”: syntax error不知道这个错误是什么原因,我拷贝的代码,换成英文就可以,用中文的就会出现这个问题

  21. 楼主我是新手,按照您的博文我写了程序,开始好好的,没动什么东西,突然提示Internal compiler error. See the console log for more information. output was:Unhandled Exception: System.TypeLoadException: Could not load type ‘Mono.Data.Sqlite.SqliteStatement’ from assembly ‘Mono.Data.Sqlite, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756’. at (wrapper managed-to-native) System.Reflection.MonoMethodInfo:get_method_info (intptr,System.Reflection.MonoMethodInfo&) at System.Reflection.MonoMethodInfo.GetMethodInfo (IntPtr handle) [0x00000] in :0 at System.Reflection.MonoMethodInfo.GetAttributes (IntPtr handle) [0x00000] in :0 at System.Reflection.MonoMethod.get_Attributes () [0x00000] in :0 at System.Reflection.MethodBase.get_IsVirtual () [0x00000] in :0 如果您看到有时间的话,麻烦帮忙解答一下

  22. 伟大的MOMO 我把你这个工程安装到我这里 为什么运行出现这个呢 ,他错误指向一个C盘的不存在的一个文件.也没有隐藏文件夹.我找不到。Non matching Profiler.EndSample (BeginSample and EndSample count must match)我没学过程序现在完全是看你的博客看你的书在自学做毕设,这里卡住了。求救啊!

  23. 为什么在我导出apk文件的时候报错:ArgumentException: The Assembly System.Configuration is referenced by System.Data. But the dll is not allowed to be included or could not be found.

  24. 博主老大,我出现问题了,一定要帮下忙啊!我的是在PC机上Windows7的环境下。最后的运行结果是只能显示数据库的绝对路径,但是插入的数据什么的都不能显示。。。。SqliteException: SQLite errornear “‘ ‘”: syntax errorMono.Data.Sqlite.SQLite3.Prepare (Mono.Data.Sqlite.SqliteConnection cnn, System.String strSql, Mono.Data.Sqlite.SqliteStatement previous, UInt32 timeoutMS, System.String& strRemain)Mono.Data.Sqlite.SqliteCommand.BuildNextCommand ()这是它报的错。还有,那个什么数据库只能创建一次的问题,那要是我的程序连续运行了两次了怎么办呢?那岂不是就创建了两次了数据库问价了?是不是要把第一次的文件给删掉呢?急急急急急急急急急啊!!!!急急急急急急急急急急急急急急啊!

    • 不应该吧, 之前有朋友已经测试通过了, 正常的插入数据。 数据库正常情况下应该是只创建一次, 第二次运行的时候 应该 是 增 删 改 查这些操作。。

      • 是这样的,因为在第一次执行程序的时候,有一个创建数据库的过程,在这个过程当中db文件就已经存在了,那我再执行第二次的时候,还是要执行一遍数据库的创建过程啊,那就应该会报错的了,我的这边的情况就是这样的,使用的你上传的那个。我在想,能不能加一个判断条件,在每次执行的时候判断下该数据库是否存在,如果存在的话就只打开不创建,不存在的话就创建并打开。但是我不知道该怎样加,而且我也不知道我这样做对不对,希望大大能够帮帮我啊。。。。我要实现的目的是我修改了我数据库中的数据之后,比如说我修改了QQ,然后在我下次执行程序的时候数据能够更新了。。。。麻烦你了啊博主老大。。。

      • 我研究了一下,应该不是数据库的问题,应该是表的问题,MOMO老大,我想问下那如何判断在u3当中的数据库的某一张表是否存在呢?

  25. momo你好,感谢你的教程。可是我遇到了问题想请教,用你的库在创建数据库时Open ()函数出错,android4.2和4.03都有问题。在eclipse查看错误信息是”Unable to find sqlite3″。但是本机其他有用到sqlite的软件是可以正常应用的,不知道unity还需要如何设置?谢谢!

  26. 雨松老师我和我同学 最近研究U3D 和数据库的连接,我们用的是C#连接MySql5.5,在windows平台的。在U3D里面运行的时候都是正常的,但是一旦导出成工程之后就连不上了,点击按钮一点反应都没有我在论坛里面问过,他们说把用到的dll拷贝到项目的Data文件夹下面,我也试过了,还是不行。请问是什么情况??

  27. 你好 我这边遇到个问题 在unity3d中直接点三角运行,结果是正确的可是生成.exe文件后,运行显示出错了output_log.txt有如下信息,但是找不到头绪, 希望得到你的帮助System.DllNotFoundException: sqlite3 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 :0 at Mono.Data.Sqlite.SqliteConnection.Open () [0x00000] in :0 at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteConnection:Open () at DbAccess.OpenDB (System.String connectionString) [0x00000] in :0 (Filename: C:/BuildAgent/work/d9c061b1c154f5ae/Runtime/ExportGenerated/StandalonePlayer/UnityEngineDebug.cpp Line: 43)System.DllNotFoundException: sqlite3 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 :0 at Mono.Data.Sqlite.SqliteConnection.Open () [0x00000] in :0 at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteConnection:Open () at DbAccess.OpenDB (System.String connectionString) [0x00000] in :0 (Filename: C:/BuildAgent/work/d9c061b1c154f5ae/Runtime/ExportGenerated/StandalonePlayer/UnityEngineDebug.cpp Line: 43)InvalidOperationException: Database is not open at Mono.Data.Sqlite.SqliteCommand.InitializeForReader () [0x00000] in :0 at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (CommandBehavior behavior) [0x00000] in :0 at Mono.Data.Sqlite.SqliteCommand.ExecuteReader () [0x00000] in :0 at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteCommand:ExecuteReader () at DbAccess.ExecuteQuery (System.String sqlQuery) [0x00000] in :0 at DbAccess.CreateTable (System.String name, System.String[] col, System.String[] colType) [0x00000] in :0 at Test.Start () [0x00000] in :0 (Filename: Line: -1)

  28. 博主,请问在IOS上用sqlite数据库实现dataset或者datatable存储数据怎么弄? 查资料说要重新编译sqlite3的库,不知到具体怎么弄?如果您知道的话请告知下,谢谢!

  29. 博主,你封装的CloseSqlConnection();这个方法好像不能完全关闭数据库,只要再unity里面运行了程序,然后停止程序,如果不关闭unity软件的话,是无法删除在Assets里面删除创建的db的,包括你给的例子也是~~
    麻烦你看一下是否能解决~~
    谢谢~~~

  30. 亲爱地楼主,我在WINDOWS平台下,修改了TEST.CS文件,想把BLOG信息也显示出来,就是提示编译错误,啥问题呢,请教
    下面是修改后的代码:using UnityEngine;
    using System.Collections;

    using Mono.Data.Sqlite;

    //using Mono.Data.SqliteClient;

    public class Test : MonoBehaviour
    {

    string name = null;
    string email = null;
    string path = null;

    void Start ()
    {
    //数据库文件储存地址
    //string appDBPath = Application.persistentDataPath + “/xuanyusong.db”;

    string appDBPath = Application.dataPath + “/xuanyusong.db”;

    //DbAccess db = new DbAccess(@”Data Source=” + appDBPath);

    DbAccess db = new DbAccess(@”Data Source=” + appDBPath);

    path = appDBPath;

    //请注意 插入字符串是 已经要加上’宣雨松’ 不然会报错
    db.CreateTable(“momo”,new string[]{“name”,”qq”,”email”,”blog”}, new string[]{“text”,”text”,”text”,”text”});
    //我在数据库中连续插入三条数据
    db.InsertInto(“momo”, new string[]{ “‘宣雨松'”,”‘289187120′”,”‘xuanyusong@gmail.com'”,”‘www.xuanyusong.com'” });
    db.InsertInto(“momo”, new string[]{ “‘雨松MOMO'”,”‘289187120′”,”‘000@gmail.com'”,”‘www.xuanyusong.com'” });
    db.InsertInto(“momo”, new string[]{ “‘哇咔咔'”,”‘289187120′”,”‘111@gmail.com'”,”‘www.xuanyusong.com'” });

    //然后在删掉两条数据
    db.Delete(“momo”,new string[]{“email”,”email”}, new string[]{“‘xuanyusong@gmail.com'”,”‘000@gmail.com'”} );

    //注解1
    using (SqliteDataReader sqReader = db.SelectWhere(“momo”,new string[]{“name”,”email”,”blog”},new string[]{“qq”},new string[]{“=”},new string

    []{“289187120”}))
    {

    while (sqReader.Read())
    {
    //目前中文无法显示
    Debug.Log(“xuanyusong” + sqReader.GetString(sqReader.GetOrdinal(“name”)));

    Debug.Log(“xuanyusong” + sqReader.GetString(sqReader.GetOrdinal(“email”)));

    name = sqReader.GetString(sqReader.GetOrdinal(“name”));
    email = sqReader.GetString(sqReader.GetOrdinal(“email”));
    blog = sqReader.GetString(sqReader.GetOrdinal(“blog”));

    }

    sqReader.Close();
    }

    db.CloseSqlConnection();
    }

    void OnGUI()
    {
    if(name != null)
    {
    GUILayout.Label(name);
    }

    if(email != null)
    {
    GUILayout.Label(email);
    }
    if(blog != null)
    {
    GUILayout.Label(blog);
    }

    if(path != null)
    {
    GUILayout.Label(path);
    }
    }

    void Update()
    {
    if (Input.GetKeyDown(KeyCode.Escape) ||Input.GetKeyDown(KeyCode.Home) )
    {

    Application.Quit();
    }
    }

    }

    • 你好代码是没有问题的, 我这边很正常,我觉得是因为你重复创建的数据库。所以报的错误?
      像这样判断一下 数据库是否存在,如果不存在在创建。
      if (!System.IO.File.Exists(@”Data Source=” + appDBPath))

    • 我发布ios的时候报了一个错误:UnityException: Failed assemblies stripper: /Applications/Unity/Unity.app/Contents/Frameworks/Mono/bin/mono “/Applications/Unity/Unity.app/Contents/Frameworks/Tools/UnusedBytecodeStripper/UnusedBytecodeStripper.exe” -l none -c link -a “Assembly-CSharp.dll” -a “Assembly-UnityScript-firstpass.dll” -a “Assembly-UnityScript.dll” -out output -x “/Applications/Unity/Unity.app/Contents/Frameworks/Tools/UnusedBytecodeStripper/link.xml” -d “Temp/StagingArea/Data/Managed” -x “tmplink.xml” current dir : Temp/StagingArea/Data/Managed result file exists: Falsestdout: stderr: Unhandled Exception: Mono.Linker.ResolutionException: Can not resolve reference: System.Reflection.Emit.DynamicMethod at Mono.Linker.Steps.MarkStep.MarkType (Mono.Cecil.TypeReference reference, System.Object markedby) [0x00000] in :0 at Mono.Linker.Steps.MarkStep.MarkField (Mono.Cecil.FieldReference reference, System.Object markedby) [0x00000] in :0 at Mono.Linker.Steps.MarkStep.MarkFields (Mono.Cecil.TypeDefinition type) [0x00000] in :0 at UnusedBytecodeStripper.VerboseMarkStep.ApplyPreserveInfo (Mono.Cecil.TypeDefinition type) [0x00000] in :0 at Mono.Linker.Steps.MarkStep.MarkType (Mono.Cecil.TypeReference reference, System.Object markedby) [0x00000] in :0 at Mono.Linker.Steps.MarkStep.ProcessMethod (Mono.Cecil.MethodDefinition method) [0x00000] in :0 at Mono.Linker.Steps.MarkStep.ProcessQueue () [0x00000] in :0 at Mono.Linker.Steps.MarkStep.Process () [0x00000] in :0 at Mono.Linker.Steps.MarkStep.Process (Mono.Linker.LinkContext context) [0x00000] in :0 at Mono.Linker.Pipeline.Process (Mono.Linker.LinkContext context) [0x00000] in :0 at UnusedBytecodeStripper.Program.Main (System.String[] args) [0x00000] in :0 UnityEditor.MonoProcessUtility.RunMonoProcess (System.Diagnostics.Process process, System.String name, System.String resultingFile)UnityEditor.MonoAssemblyStripping.MonoLink (BuildTarget buildTarget, System.String managedLibrariesDirectory, System.String[] input, System.String[] allAssemblies, UnityEditor.RuntimeClassRegistry usedClasses)UnityEditor.HostView:OnGUI()不明白是怎么回事,代码应该没有问题,我直接用的你的那个例子,还是报这个错误最后我用:http://wiki.unity3d.com/index.php?title=SQLite这里面的代码测试,依然如此,我想知道是什么地方设置的问题还是机子的原因或者怎么回事,我装的虚拟机。2.0那个设置没什么问题!救命啊!!!

  31. 博主我发现,如果Mono.Data.Sqlite,sqlite3,System.data这3个dll不放在plugins这个目录下面那么编译的时候就不会被编译进程序的data文件夹下,这是怎么回事?unity的固有性质?需要打包的东西都必须放在plugins下面吗?还是可以放在其他什么文件夹下面,只是需要做一些设置呢?

  32. 我编译了~~
    但是运行后,在游戏目录下没有db文件生成~~
    恩 好像还是有问题,编译通过了,但没有文件生成

  33. 楼主你好~~首先很感谢你提供的方法,
    在windows下面用你提供的方法生成游戏时,提示说找不到那两个dll,用你提供的packag也是一样的问题~~
    请问要怎样解决呢?
    谢谢~~~

  34. 楼主,我运行游戏的时候没法儿生成项目,报错:Error building Player: Extracting referenced dlls failed.这是怎么回事儿?