Unity3D教程:与Sqlite数据库直连

前端之家收集整理的这篇文章主要介绍了Unity3D教程:与Sqlite数据库直连前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

环境介绍:

Windows7,Unity3D,sqlite Expert Personal 3

开发语言:

JavaScript

需要的dll文件

Mono.Data.sqlite.dll和sqlite3.dll,dll文件位置,截图:

Unity3D教程:Unity3D与sqlite数据库直连

一定要在这个目录下,请保持一致。

如果需要将编译好的程序发布成功的话,需要改一些地方,具体见下面的截图:

要改动的地方已用红色标记,注意这个要改成.NET2.0,这样才能够发布的。系统默认的不是.NET2.0,这一点要注意!!!

下面来看下代码吧,先看下如何创建数据库代码,这一篇代码是不用挂到任何对象上面去的,你只用把它当成一个工具即可。如下所示:

  
  
  1. /*Javascriptclassforaccessingsqliteobjects.@H_404_38@
  2. Touseit,youneedtomakesureyouCOPYMono.Data.sqliteClient.dllfromwhereveritlivesinyourUnitydirectory@H_404_38@
  3. toyourproject'sAssetsfolder@H_404_38@
  4. Originallycreatedbydklompmakerin2009@H_404_38@
  5. http://forum.unity3d.com/threads...sier-Database-Stuff@H_404_38@
  6. Modified2011byAlanChatham*/@H_404_38@
  7. //#pragmastrict@H_404_38@
  8. /*@H_404_38@

代码描述

*本代码是为了在Windows环境下运行unity3d和sqlite数据库而写的;实现的基本功能是unity3d能够与数据库之间进行基本的通信,比如说:在数据库中的数据被改变了以后,unity3d中得到的数据也会在刷新了之后跟着改变;这只是一个基本的核心的技术,为的是能够应用在大型的unity3d项目中,能够存储场景中的项目的属性,在需要改变对象的属性增加、减少等对象时能够很方便的用得上。要实现本代码。首先需要一些dll文件,一个是Mono.Data.sqliteClient.dll,另外一个是sqlite3.dll,这些文件都能够在unity3d的安装目录中找得到。除此之外,还需要把这两个文件放在你的项目的这个路径下面:\Assets\Plugins\,没有Plugins文件夹就必须创建这个文件夹,然后将这两个dll文件放在该文件夹写。当然,如果你想能够在PC上面发布成可执行文件,还需要改动一些地方。在unity3d中的Play Setting ->Other Setting 中将Api Compatibility的等级改为.NET 2.0;那么这些操作做完了以后,如果你的代码写得没有问题,那么你就可以成功了。

细解释代码

  
  
  1. *@H_404_38@
  2. */@H_404_38@
  3. importSystem.Data;//weimportourdataclass我们先导入我们的数据集@H_404_38@
  4. importMono.Data.sqlite;//weimportsqlite我们导入sqlite数据集,也就是Plugins文件夹下的那个dll文件@H_404_38@
  5. classdbAccess{@H_404_38@
  6. //variablesforbasicqueryaccess@H_404_38@
  7. privatevarconnection:String;//数据库的连接字符串,用于建立与特定数据源的连接@H_404_38@
  8. privatevardbcon:IDbConnection;//IDbConnection的连接对象,其实就是一个类对象@H_404_38@
  9. privatevardbcmd:IDbCommand;//IDbCommand类对象,用来实现操作数据库的命令:注解:我在网上资料看到的如何实现对数据库执行命令:@H_404_38@
  10. //首先创建一个IDbConnection连接对象,然后将一条数据库命令赋值给一个字符串,利用这个字符串和连接对象@H_404_38@
  11. //就可以创建(new)一个IDbCommand对象了,然后使用提供的方法就可以执行这个命令了。@H_404_38@
  12. privatevarreader:IDataReader;//reader的作用就是读取结果集的一个或多个只进结果流@H_404_38@
  13. functionOpenDB(p:String){@H_404_38@
  14. connection="URI=file:"+p;//wesettheconnectiontoourdatabase@H_404_38@
  15. dbcon=newsqliteConnection(connection);@H_404_38@
  16. dbcon.Open();//打开数据库连接操作@H_404_38@
  17. }@H_404_38@
  18. functionBasicQuery(q:String,r:boolean){//runabaicsqlitequery@H_404_38@
  19. dbcmd=dbcon.CreateCommand();//createemptycommand@H_404_38@
  20. dbcmd.CommandText=q;//fillthecommand@H_404_38@
  21. reader=dbcmd.ExecuteReader();//executecommandwhichreturnsareader返回IDataReader的对象,创建IDataReader的对象@H_404_38@
  22. if(r){//ifwewanttoreturnthereader@H_404_38@
  23. returnreader;//returnthereader返回读取的对象,就是读到了什么东西@H_404_38@
  24. }@H_404_38@
  25. }@H_404_38@
  26. //Thisreturnsa2dimensionalArrayListwithallthe@H_404_38@
  27. //datafromthetablerequested@H_404_38@
  28. functionReadFullTable(tableName:String){@H_404_38@
  29. varquery:String;@H_404_38@
  30. query="SELECT*FROM"+tableName;@H_404_38@
  31. dbcmd=dbcon.CreateCommand();@H_404_38@
  32. dbcmd.CommandText=query;@H_404_38@
  33. reader=dbcmd.ExecuteReader();@H_404_38@
  34. varreadArray=newArrayList();@H_404_38@
  35. while(reader.Read()){@H_404_38@
  36. varlineArray=newArrayList();@H_404_38@
  37. for(vari=0;i<reader.FieldCount;i++)@H_404_38@
  38. lineArray.Add(reader.GetValue(i));//Thisreadstheentriesinarow@H_404_38@
  39. readArray.Add(lineArray);//Thismakesanarrayofalltherows@H_404_38@
  40. }@H_404_38@
  41. returnreadArray;//returnmatches@H_404_38@
  42. }@H_404_38@
  43. //Thisfunctiondeletesallthedatainthegiventable.Forever.WATCHOUT!Usesparingly,ifatall@H_404_38@
  44. functionDeleteTableContents(tableName:String){@H_404_38@
  45. varquery:String;@H_404_38@
  46. query="DELETEFROM"+tableName;@H_404_38@
  47. dbcmd=dbcon.CreateCommand();@H_404_38@
  48. dbcmd.CommandText=query;@H_404_38@
  49. reader=dbcmd.ExecuteReader();@H_404_38@
  50. }@H_404_38@
  51. functionCreateTable(name:String,col:Array,colType:Array){//Createatable,name,columnarray,columntypearray@H_404_38@
  52. varquery:String;@H_404_38@
  53. query="CREATETABLE"+name+"("+col[0]+""+colType[0];@H_404_38@
  54. for(vari=1;i<col.length;i++){@H_404_38@
  55. query+=","+col+""+colType;@H_404_38@
  56. }@H_404_38@
  57. query+=")";@H_404_38@
  58. dbcmd=dbcon.CreateCommand();//createemptycommand@H_404_38@
  59. dbcmd.CommandText=query;//fillthecommand@H_404_38@
  60. reader=dbcmd.ExecuteReader();//executecommandwhichreturnsareader@H_404_38@
  61. }@H_404_38@
  62. functionInsertIntoSingle(tableName:String,colName:String,value:String){//singleinsert@H_404_38@
  63. varquery:String;@H_404_38@
  64. query="INSERTINTO"+tableName+"("+colName+")"+"VALUES("+value+")";@H_404_38@
  65. dbcmd=dbcon.CreateCommand();//createemptycommand@H_404_38@
  66. dbcmd.CommandText=query;//fillthecommand@H_404_38@
  67. reader=dbcmd.ExecuteReader();//executecommandwhichreturnsareader@H_404_38@
  68. }@H_404_38@
  69. functionInsertIntoSpecific(tableName:String,values:Array){//Specificinsertwithcolandvalues@H_404_38@
  70. varquery:String;@H_404_38@
  71. query="INSERTINTO"+tableName+"("+col[0];@H_404_38@
  72. for(vari=1;i<col.length;i++){@H_404_38@
  73. query+=","+col;@H_404_38@
  74. }@H_404_38@
  75. query+=")VALUES("+values[0];@H_404_38@
  76. for(i=1;i<values.length;i++){@H_404_38@
  77. query+=","+values;@H_404_38@
  78. }@H_404_38@
  79. query+=")";@H_404_38@
  80. dbcmd=dbcon.CreateCommand();@H_404_38@
  81. dbcmd.CommandText=query;@H_404_38@
  82. reader=dbcmd.ExecuteReader();@H_404_38@
  83. }@H_404_38@
  84. functionInsertInto(tableName:String,values:Array){//basicInsertwithjustvalues@H_404_38@
  85. varquery:String;@H_404_38@
  86. query="INSERTINTO"+tableName+"VALUES("+values[0];@H_404_38@
  87. for(vari=1;i<values.length;i++){@H_404_38@
  88. query+=","+values;@H_404_38@
  89. }@H_404_38@
  90. query+=")";@H_404_38@
  91. dbcmd=dbcon.CreateCommand();@H_404_38@
  92. dbcmd.CommandText=query;@H_404_38@
  93. reader=dbcmd.ExecuteReader();@H_404_38@
  94. }@H_404_38@
  95. //Thisfunctionreadsasinglecolumn@H_404_38@
  96. //wColistheWHEREcolumn,wParistheoperatoryouwanttousetocomparewith,@H_404_38@
  97. //andwValueisthevalueyouwanttocompareagainst.@H_404_38@
  98. //Ex.-SingleSelectWhere("puppies","breed","earType","=","floppy")@H_404_38@
  99. //returnsanarrayofmatchesfromthecommand:SELECTbreedFROMpuppiesWHEREearType=floppy;@H_404_38@
  100. functionSingleSelectWhere(tableName:String,itemToSelect:String,wCol:String,wPar:String,wValue:String){//SelectsasingleItem@H_404_38@
  101. varquery:String;@H_404_38@
  102. query="SELECT"+itemToSelect+"FROM"+tableName+"WHERE"+wCol+wPar+wValue;@H_404_38@
  103. dbcmd=dbcon.CreateCommand();@H_404_38@
  104. dbcmd.CommandText=query;@H_404_38@
  105. reader=dbcmd.ExecuteReader();@H_404_38@
  106. varreadArray=newArray();@H_404_38@
  107. while(reader.Read()){@H_404_38@
  108. readArray.Push(reader.GetString(0));//Fillarraywithallmatches@H_404_38@
  109. }@H_404_38@
  110. returnreadArray;//returnmatches@H_404_38@
  111. }@H_404_38@
  112. functionCloseDB(){@H_404_38@
  113. reader.Close();//cleaneverythingup@H_404_38@
  114. reader=null;@H_404_38@
  115. dbcmd.Dispose();@H_404_38@
  116. dbcmd=null;@H_404_38@
  117. dbcon.Close();@H_404_38@
  118. dbcon=null;@H_404_38@
  119. }@H_404_38@
  120. }@H_404_38@

7、如何在Unity3D中使用这个数据库代码

  
  
  1. //#pragmastrict@H_404_38@
  2. /*ScriptfortestingoutsqliteinJavascript@H_404_38@
  3. 2011-AlanChatham@H_404_38@
  4. Releasedintothepublicdomain@H_404_38@
  5. ThisscriptisaGUIscript-attachittoyourmaincamera.@H_404_38@
  6. @H_404_38@
  7. Itcreates/opensasqlitedatabase,andwiththeGUIyoucanreadandwritetoit.@H_404_38@
  8. @H_404_38@
  9. */@H_404_38@
  10. @H_404_38@
  11. //Thisisthefilepathofthedatabasefilewewanttouse@H_404_38@
  12. @H_404_38@
  13. //Rightnow,it'llloadTestDB.sqdbintheproject'srootfolder.@H_404_38@
  14. @H_404_38@
  15. //Ifonedoesn'texist,itwillbeautomaticallycreated.@H_404_38@
  16. @H_404_38@
  17. publicvarDatabaseName:String="TestDB.sqdb";@H_404_38@
  18. @H_404_38@
  19. //Thisisthenameofthetablewewanttouse@H_404_38@
  20. @H_404_38@
  21. publicvarTableName:String="TestTable";@H_404_38@
  22. @H_404_38@
  23. vardb:dbAccess;@H_404_38@
  24. @H_404_38@
  25. functionStart(){@H_404_38@
  26. @H_404_38@
  27. //GiveourselvesadbAccessobjecttoworkwith,andopenit@H_404_38@
  28. @H_404_38@
  29. db=newdbAccess();@H_404_38@
  30. @H_404_38@
  31. db.OpenDB(DatabaseName);@H_404_38@
  32. @H_404_38@
  33. //Let'smakesurewe'vegotatabletoworkwithaswell!@H_404_38@
  34. @H_404_38@
  35. vartableName=TableName;@H_404_38@
  36. @H_404_38@
  37. varcolumnNames=newArray("firstName","lastName");@H_404_38@
  38. @H_404_38@
  39. varcolumnValues=newArray("text","text");@H_404_38@
  40. @H_404_38@
  41. try{db.CreateTable(tableName,columnNames,columnValues);@H_404_38@
  42. @H_404_38@
  43. }@H_404_38@
  44. @H_404_38@
  45. catch(e){//Donothing-ourtablewasalreadycreated判断表是否被创建了@H_404_38@
  46. @H_404_38@
  47. //-wedon'tcareabouttheerror,wejustdon'twanttoseeit@H_404_38@
  48. @H_404_38@
  49. }@H_404_38@
  50. @H_404_38@
  51. }@H_404_38@
  52. @H_404_38@
  53. //ThesevariablesjustholdinfotodisplayinourGUI@H_404_38@
  54. @H_404_38@
  55. varfirstName:String="FirstName";@H_404_38@
  56. @H_404_38@
  57. varlastName:String="LastName";@H_404_38@
  58. @H_404_38@
  59. varDatabaseEntryStringWidth=100;@H_404_38@
  60. @H_404_38@
  61. varscrollPosition:Vector2;@H_404_38@
  62. @H_404_38@
  63. vardatabaseData:ArrayList=newArrayList();@H_404_38@
  64. @H_404_38@
  65. //ThisGUIprovidesuswithawaytoenterdataintoourdatabase@H_404_38@
  66. @H_404_38@
  67. //aswellasawaytoviewit@H_404_38@
  68. @H_404_38@
  69. functionOnGUI(){@H_404_38@
  70. @H_404_38@
  71. GUI.Box(Rect(25,25,Screen.width-50,Screen.height-50),"Data");@H_404_38@
  72. @H_404_38@
  73. GUILayout.BeginArea(Rect(50,50,Screen.width-100,Screen.height-100));@H_404_38@
  74. @H_404_38@
  75. //Thisfirstblockallowsustoenternewentriesintoourtable@H_404_38@
  76. @H_404_38@
  77. GUILayout.BeginHorizontal();@H_404_38@
  78. @H_404_38@
  79. firstName=GUILayout.TextField(firstName,GUILayout.Width(DatabaseEntryStringWidth));@H_404_38@
  80. @H_404_38@
  81. lastName=GUILayout.TextField(lastName,GUILayout.Width(DatabaseEntryStringWidth));@H_404_38@
  82. @H_404_38@
  83. //lastName=GUILayout.TextField();@H_404_38@
  84. @H_404_38@
  85. GUILayout.EndHorizontal();@H_404_38@
  86. @H_404_38@
  87. if(GUILayout.Button("Addtodatabase")){@H_404_38@
  88. @H_404_38@
  89. //Insertthedata@H_404_38@
  90. @H_404_38@
  91. InsertRow(firstName,lastName);@H_404_38@
  92. @H_404_38@
  93. //Andupdatethereadoutofthedatabase@H_404_38@
  94. @H_404_38@
  95. databaseData=ReadFullTable();@H_404_38@
  96. @H_404_38@
  97. }@H_404_38@
  98. @H_404_38@
  99. //Thissecondblockgivesusabuttonthatwilldisplay/refreshthecontentsofourdatabase@H_404_38@
  100. @H_404_38@
  101. GUILayout.BeginHorizontal();@H_404_38@
  102. @H_404_38@
  103. if(GUILayout.Button("ReadDatabase"))@H_404_38@
  104. @H_404_38@
  105. databaseData=ReadFullTable();@H_404_38@
  106. @H_404_38@
  107. if(GUILayout.Button("Clear"))@H_404_38@
  108. @H_404_38@
  109. databaseData.Clear();@H_404_38@
  110. @H_404_38@
  111. GUILayout.EndHorizontal();@H_404_38@
  112. @H_404_38@
  113. GUILayout.Label("DatabaseContents");@H_404_38@
  114. @H_404_38@
  115. scrollPosition=GUILayout.BeginScrollView(scrollPosition,GUILayout.Height(100));@H_404_38@
  116. @H_404_38@
  117. for(varline:ArrayListindatabaseData){@H_404_38@
  118. @H_404_38@
  119. GUILayout.BeginHorizontal();@H_404_38@
  120. @H_404_38@
  121. for(varsinline){@H_404_38@
  122. @H_404_38@
  123. GUILayout.Label(s.ToString(),GUILayout.Width(DatabaseEntryStringWidth));@H_404_38@
  124. @H_404_38@
  125. }@H_404_38@
  126. @H_404_38@
  127. GUILayout.EndHorizontal();@H_404_38@
  128. @H_404_38@
  129. }@H_404_38@
  130. @H_404_38@
  131. GUILayout.EndScrollView();@H_404_38@
  132. @H_404_38@
  133. if(GUILayout.Button("DeleteAllData")){@H_404_38@
  134. @H_404_38@
  135. DeleteTableContents();@H_404_38@
  136. @H_404_38@
  137. databaseData=ReadFullTable();@H_404_38@
  138. @H_404_38@
  139. }@H_404_38@
  140. @H_404_38@
  141. GUILayout.EndArea();@H_404_38@
  142. @H_404_38@
  143. }@H_404_38@
  144. @H_404_38@
  145. //Wrapperfunctionforinsertingourspecificentriesintoourspecificdatabaseandtableforthisfile@H_404_38@
  146. @H_404_38@
  147. functionInsertRow(firstName,lastName){@H_404_38@
  148. @H_404_38@
  149. varvalues=newArray(("'"+firstName+"'"),("'"+lastName+"'"));@H_404_38@
  150. @H_404_38@
  151. db.InsertInto(TableName,values);@H_404_38@
  152. @H_404_38@
  153. }@H_404_38@
  154. @H_404_38@
  155. //Wrapperfunction,soweonlymesswithourtable.@H_404_38@
  156. @H_404_38@
  157. functionReadFullTable(){@H_404_38@
  158. @H_404_38@
  159. returndb.ReadFullTable(TableName);@H_404_38@
  160. @H_404_38@
  161. }@H_404_38@
  162. @H_404_38@
  163. //Anotherwrapperfunction...@H_404_38@
  164. @H_404_38@
  165. functionDeleteTableContents(){@H_404_38@
  166. @H_404_38@
  167. db.DeleteTableContents(TableName);@H_404_38@
  168. @H_404_38@
  169. }@H_404_38@

运行结果:

这是在Unity3D中运行的结果,数据的操作结果如下:

我们看见了数据的操作能够成功,经过测试,其他的Button也都能出现相对应的效果,那我们再看看这个到底有没有生成我们想要的数据库文件

文件当中数据:经测试,我们在对数据库中的数据进行操作的时候,我们的Unity3D中的数据也会发生相应的改变了!

原文链接:http://bbs.9ria.com/forum.PHP?mod=viewthread&tid=168629&fromuid=308561

猜你在找的Sqlite相关文章