您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> ios >> 正文

iOS开发:Unity3D 使用C#语言建立本地数据库

作者:佚名    责任编辑:admin    更新时间:2022-06-22

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

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

iOS开发:Unity3D 使用C#语言建立本地数据库 三联

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

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

  [代码]java代码:

001 using UnityEngine; 002   003 using System; 004 using System.Collections; 005 using Mono.Data.Sqlite; 006   007 public class DbAccess 008   009 { 010   011 private SqliteConnection dbConnection; 012   013 private SqliteCommand dbCommand; 014   015 private SqliteDataReader reader; 016   017 public DbAccess (string connectionString) 018   019 { 020   021 OpenDB (connectionString); 022   023 } 024 public DbAccess () 025 { 026   027 } 028   029 public void OpenDB (string connectionString) 030   031 { 032 try 033 { 034 dbConnection = new SqliteConnection (connectionString); 035   036 dbConnection.Open (); 037   038 Debug.Log ("Connected to db"); 039 } 040 catch(Exception e) 041 { 042 string temp1 = e.ToString(); 043 Debug.Log(temp1); 044 } 045   046 } 047   048 public void CloseSqlConnection () 049   050 { 051   052 if (dbCommand != null) { 053   054 dbCommand.Dispose (); 055   056 } 057   058 dbCommand = null; 059   060 if (reader != null) { 061   062 reader.Dispose (); 063   064 } 065   066 reader = null; 067   068 if (dbConnection != null) { 069   070 dbConnection.Close (); 071   072 } 073   074 dbConnection = null; 075   076 Debug.Log ("Disconnected from db."); 077   078 } 079   080 public SqliteDataReader ExecuteQuery (string sqlQuery) 081   082 { 083   084 dbCommand = dbConnection.CreateCommand (); 085   086 dbCommand.CommandText = sqlQuery; 087   088 reader = dbCommand.ExecuteReader (); 089   090 return reader; 091   092 } 093   094 public SqliteDataReader ReadFullTable (string tableName) 095   096 { 097   098 string query = "SELECT * FROM " + tableName; 099   100 return ExecuteQuery (query); 101   102 } 103   104 public SqliteDataReader InsertInto (string tableName, string[] values) 105   106 { 107   108 string query = "INSERT INTO " + tableName + " VALUES (" + values[0]; 109   110 for (int i = 1; i < values.Length; ++i) { 111   112 query += ", " + values[i]; 113   114 } 115   116 query += ")"; 117   118 return ExecuteQuery (query); 119   120 } 121   122 public SqliteDataReader UpdateInto (string tableName, string []cols,string []colsvalues,string selectkey,string selectvalue) 123 { 124   125 string query = "UPDATE "+tableName+" SET "+cols[0]+" = "+colsvalues[0]; 126   127 for (int i = 1; i < colsvalues.Length; ++i) { 128   129 query += ", " +cols[i]+" ="+ colsvalues[i]; 130 } 131   132 query += " WHERE "+selectkey+" = "+selectvalue+" "; 133   134 return ExecuteQuery (query); 135 } 136   137 public SqliteDataReader Delete(string tableName,string []cols,string []colsvalues) 138 { 139 string query = "DELETE FROM "+tableName + " WHERE " +cols[0] +" = " + colsvalues[0]; 140   141 for (int i = 1; i < colsvalues.Length; ++i) { 142   143 query += " or " +cols[i]+" = "+ colsvalues[i]; 144 } 145 Debug.Log(query); 146 return ExecuteQuery (query); 147 } 148   149 public SqliteDataReader InsertIntoSpecific (string tableName, string[] cols, string[] values) 150   151 { 152   153 if (cols.Length != values.Length) { 154   155 throw new SqliteException ("columns.Length != values.Length"); 156   157 } 158   159 string query = "INSERT INTO " + tableName + "(" + cols[0]; 160   161 for (int i = 1; i < cols.Length; ++i) { 162   163 query += ", " + cols[i]; 164   165 } 166   167 query += ") VALUES (" + values[0]; 168   169 for (int i = 1; i < values.Length; ++i) { 170   171 query += ", " + values[i]; 172   173 } 174   175 query += ")"; 176   177 return ExecuteQuery (query); 178   179 } 180   181 public SqliteDataReader DeleteContents (string tableName) 182   183 { 184   185 string query = "DELETE FROM " + tableName; 186   187 return ExecuteQuery (query); 188   189 } 190   191 public SqliteDataReader CreateTable (string name, string[] col, string[] colType) 192   193 { 194   195 if (col.Length != colType.Length) { 196   197 throw new SqliteException ("columns.Length != colType.Length"); 198   199 } 200   201 string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0]; 202   203 for (int i = 1; i < col.Length; ++i) { 204   205 query += ", " + col[i] + " " + colType[i]; 206   207 } 208   209 query += ")"; 210   211 return ExecuteQuery (query); 212   213 } 214   215 public SqliteDataReader SelectWhere (string tableName, string[] items, string[] col, string[] operation, string[] values) 216   217 { 218   219 if (col.Length != operation.Length || operation.Length != values.Length) { 220   221 throw new SqliteException ("col.Length != operation.Length != values.Length"); 222   223 } 224   225 string query = "SELECT " + items[0]; 226   227 for (int i = 1; i < items.Length; ++i) { 228   229 query += ", " + items[i]; 230   231 } 232   233 query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' "; 234   235 for (int i = 1; i < col.Length; ++i) { 236   237 query += " AND " + col[i] + operation[i] + "'" + values[0] + "' "; 238   239 } 240   241 return ExecuteQuery (query); 242   243 } 244   245 }

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

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 public class Test : MonoBehaviour 05 { 06   07 void Start () 08 { 09   10 //创建数据库名称为xuanyusong.db 11 DbAccess db = new DbAccess("data source=xuanyusong.db"); 12   13 //创建数据库表,与字段 14 db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); 15 //关闭对象 16 db.CloseSqlConnection(); 17 } 18   19 }

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

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

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 public class Test : MonoBehaviour 05 { 06   07 void Start () 08 { 09   10 //创建数据库名称为xuanyusong.db 11 DbAccess db = new DbAccess("data source=xuanyusong.db"); 12 //请注意 插入字符串是 已经要加上'宣雨松' 不然会报错 13 db.InsertInto("momo", new string[]{ "'宣雨松'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 14 db.CloseSqlConnection(); 15 } 16   17 }

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

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 public class Test : MonoBehaviour 05 { 06   07 void Start () 08 { 09   10 //创建数据库名称为xuanyusong.db 11 DbAccess db = new DbAccess("data source=xuanyusong.db"); 12   13 db.UpdateInto("momo",new string[]{"name","qq"},new string[]{"'xuanyusong'","'11111111'"}, "email", "'[email protected]'" ); 14   15 db.CloseSqlConnection(); 16 } 17   18 }

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

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 public class Test : MonoBehaviour 05 { 06   07 void Start () 08 { 09   10 //创建数据库名称为xuanyusong.db 11 DbAccess db = new DbAccess("data source=xuanyusong.db"); 12 //请注意 插入字符串是 已经要加上'宣雨松' 不然会报错 13 db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); 14 //我在数据库中连续插入三条数据 15 db.InsertInto("momo", new string[]{ "'宣雨松'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 16 db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 17 db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 18   19 //然后在删掉两条数据 20 db.Delete("momo",new string[]{"email","email"}, new string[]{"'[email protected]'","'[email protected]'"} ); 21   22 db.CloseSqlConnection(); 23 } 24   25 }

  最后是查找数据。

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 using Mono.Data.Sqlite; 05 public class Test : MonoBehaviour 06 { 07   08 void Start () 09 { 10   11 //创建数据库名称为xuanyusong.db 12 DbAccess db = new DbAccess("data source=xuanyusong.db"); 13 //请注意 插入字符串是 已经要加上'宣雨松' 不然会报错 14 db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); 15 //我在数据库中连续插入三条数据 16 db.InsertInto("momo", new string[]{ "'宣雨松'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 17 db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 18 db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 19   20 //然后在删掉两条数据 21 db.Delete("momo",new string[]{"email","email"}, new string[]{"'[email protected]'","'[email protected]'"} ); 22   23 //注解1 24 SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{"289187120"}); 25   26 while (sqReader.Read()) 27 { 28 Debug.Log(sqReader.GetString(sqReader.GetOrdinal("name")) + sqReader.GetString(sqReader.GetOrdinal("email"))); 29 } 30   31 db.CloseSqlConnection(); 32 } 33   34 }

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

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

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

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

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

  IOS平台SQLite的使用:

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

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 using Mono.Data.Sqlite; 05 public class Test : MonoBehaviour 06 { 07   08 void Start () 09 { 10 //数据库文件储存地址 11 string appDBPath = Application.persistentDataPath + "/xuanyusong.db"; 12   13 DbAccess db = new DbAccess(@"Data Source=" + appDBPath); 14   15 //请注意 插入字符串是 已经要加上'宣雨松' 不然会报错 16 db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); 17 //我在数据库中连续插入三条数据 18 db.InsertInto("momo", new string[]{ "'宣雨松'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 19 db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 20 db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 21   22 //然后在删掉两条数据 23 db.Delete("momo",new string[]{"email","email"}, new string[]{"'[email protected]'","'[email protected]'"} ); 24   25 //注解1 26 using (SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{"289187120"})) 27 { 28   29 while (sqReader.Read()) 30 { 31 //目前中文无法显示 32 Debug.Log(sqReader.GetString(sqReader.GetOrdinal("name"))); 33   34 Debug.Log(sqReader.GetString(sqReader.GetOrdinal("email"))); 35   36 } 37   38 sqReader.Close(); 39 } 40   41 db.CloseSqlConnection(); 42 } 43   44 }

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

  Android平台SQLite的使用:

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

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 using Mono.Data.Sqlite; 05 public class Test : MonoBehaviour 06 { 07   08 void Start () 09 { 10 //数据库文件储存地址 11   12 string appDBPath = Application.persistentDataPath + "/xuanyusong.db"; 13   14 //注意!!!!!!!这行代码的改动 15 DbAccess db = new DbAccess("URI=file:" + appDBPath); 16   17 //请注意 插入字符串是 已经要加上'宣雨松' 不然会报错 18 db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); 19 //我在数据库中连续插入三条数据 20 db.InsertInto("momo", new string[]{ "'宣雨松'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 21 db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 22 db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 23   24 //然后在删掉两条数据 25 db.Delete("momo",new string[]{"email","email"}, new string[]{"'[email protected]'","'[email protected]'"} ); 26   27 //注解1 28 using (SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{"289187120"})) 29 { 30   31 while (sqReader.Read()) 32 { 33 Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("name"))); 34   35 Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("email"))); 36   37 } 38   39 sqReader.Close(); 40 } 41   42 db.CloseSqlConnection(); 43 } 44   45 void Update() 46 { 47 if (Input.GetKeyDown(KeyCode.Escape) ||Input.GetKeyDown(KeyCode.Home) ) 48 { 49   50 Application.Quit(); 51 } 52 } 53   54 }

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

  值得庆幸的是在Android下读取数据库时正常的显示了中文。如下图所示,运行打包后的程序后在Eclipse的后台已经能看到数据库显示的中文与英文,呵呵。

  由于工程中需要一些DLL,所以我将工程的下载地址放出,请大家下载。AndroidSQL.unitypackage.zip

  MAC平台下的使用:

  请先下载原始版本 SQLite (1).unitypackage.zip

  我们只需在原始版本之上进行修改即可。

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

  [代码]java代码:

01 using UnityEngine; 02 using System.Collections; 03   04 using Mono.Data.Sqlite; 05 public class Test : MonoBehaviour 06 { 07   08 string name = null; 09 string email = null; 10 string appDBPath = null; 11 void Start () 12 { 13   14 //////////-------- 15 //请注意!!!!!!! 16 //这里的修改 17   18 appDBPath = Application.dataPath + "/xuanyusong.db"; 19   20 DbAccess db = new DbAccess(@"Data Source=" + appDBPath); 21   22 //////////-------- 23   24 //请注意 插入字符串是 已经要加上'宣雨松' 不然会报错 25 db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); 26 //我在数据库中连续插入三条数据 27 db.InsertInto("momo", new string[]{ "'宣雨松'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 28 db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 29 db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 30   31 //然后在删掉两条数据 32 db.Delete("momo",new string[]{"email","email"}, new string[]{"'[email protected]'","'[email protected]'"} ); 33   34 SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{"289187120"}); 35   36 while (sqReader.Read()) 37 { 38   39 Debug.Log(sqReader.GetString(sqReader.GetOrdinal("name")) + sqReader.GetString(sqReader.GetOrdinal("email"))); 40   41 //取值 42 name = sqReader.GetString(sqReader.GetOrdinal("name")); 43 email = sqReader.GetString(sqReader.GetOrdinal("email")); 44 } 45   46 db.CloseSqlConnection(); 47 } 48   49 void OnGUI() 50 { 51   52 ///为了让大家看的更清楚 我将数据库取出的内容显示在屏幕中 53 if(name != null) 54 { 55 GUILayout.Label("XXXXXXXXXXXXX" + name); 56   57 } 58   59 if (email!= null) 60 { 61 GUILayout.Label("XXXXXXXXXXXXX" + email); 62 } 63   64 if(appDBPath != null) 65 { 66 GUILayout.Label("数据库的路径" + appDBPath); 67 } 68   69 } 70   71 }

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

  Windows平台SQLite的使用:

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

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

  [代码]java代码:

01 using System.Collections; 02   03 using Mono.Data.Sqlite; 04   05 //using Mono.Data.SqliteClient; 06   07 public class Test : MonoBehaviour 08 { 09   10 string name = null; 11 string email = null; 12 string path = null; 13   14 void Start () 15 { 16 //数据库文件储存地址 17   18 //注意这里的修改!!!!!!!!!!!!!! 19 string appDBPath = Application.dataPath + "/xuanyusong.db"; 20   21 //-------------------------- 22   23 DbAccess db = new DbAccess(@"Data Source=" + appDBPath); 24   25 path = appDBPath; 26   27 //请注意 插入字符串是 已经要加上'宣雨松' 不然会报错 28 db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"}); 29 //我在数据库中连续插入三条数据 30 db.InsertInto("momo", new string[]{ "'宣雨松'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 31 db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 32 db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'[email protected]'","'www.xuanyusong.com'" }); 33   34 //然后在删掉两条数据 35 db.Delete("momo",new string[]{"email","email"}, new string[]{"'[email protected]'","'[email protected]'"} ); 36   37 //注解1 38 using (SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{"289187120"})) 39 { 40   41 while (sqReader.Read()) 42 { 43 //目前中文无法显示 44 Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("name"))); 45   46 Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("email"))); 47   48 name = sqReader.GetString(sqReader.GetOrdinal("name")); 49 email = sqReader.GetString(sqReader.GetOrdinal("email")); 50   51 } 52   53 sqReader.Close(); 54 } 55   56 db.CloseSqlConnection(); 57 } 58   59 void OnGUI() 60 { 61 if(name != null) 62 { 63 GUILayout.Label(name); 64 } 65   66 if(email != null) 67 { 68 GUILayout.Label(email); 69 } 70   71 if(path != null) 72 { 73 GUILayout.Label(path); 74 } 75 } 76   77 }

  如下图所示打开Unity然后我们需要下载sqlite3.dll文件,接着将dll都放入Plugins文件夹中。不用担心 稍后我会把真个工程的下载地址贴出来其中包括所有的dll 。

  最后直接打包成Windows平台工程。双击运行.exe文件,如下图所示数据库的数据以及路径MOMO已经打印在屏幕当中啦。哇咔咔~ 然后xuanyusong.db文件就放在ddd_Date文件夹中,我已经用红圈标注出来了。ddd就是工程的名称,ddd_Date该文件夹是自动生成的。