首先你需要得到Mono.Data.Sqlite.dll 文件 与System.Data.dll文件。如果你在Mac 操作系统下使用Unity那么很悲剧,找不到这两个文件,至少我没能找到。后来我在Windows下的Unity安装路径中找到了它。为了方便大家我将这两个文件上传至网盘中,如果没有这两个文件的朋友请下载。Unity数据库文件.zip
.zip文件下载完毕后直接解压,然后将Mono.Data.Sqlite.dll 文件 与System.Data.dll文件放在Unity工程中的Assets文件夹中。如下图所示,两个文件已经放置在Project视图当中。
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该文件夹是自动生成的。