Unity3D研究之使用C#语言建立本地数据库

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

采用html5+css3国际标准网站建设,让网站自动适应用户使用终端设备,PC、平板、手机等,一个网址适应,一套内容统一战略,节约企业资源。创新互联还提供网站后期营销如:软文发稿卖友情链接广告投放平台等。一般建站公司不为企业填充资料,更谈不上内容策划,结果导致网站界面优秀,内容却十分空泛或整体不协调,内容策划、内容填充请交给我们。

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

首先你需要得到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代码:

001using UnityEngine;
002 
003using System;
004using System.Collections;
005using Mono.Data.Sqlite;
006 
007public 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代码:

01using UnityEngine;
02using System.Collections;
03 
04public 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代码:

01using UnityEngine;
02using System.Collections;
03 
04public 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'","'xuanyusong@gmail.com'","'www.xuanyusong.com'"   });
14        db.CloseSqlConnection();
15    }
16 
17}

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

[代码]java代码:

01using UnityEngine;
02using System.Collections;
03 
04public 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", "'xuanyusong@gmail.com'"  );
14 
15        db.CloseSqlConnection();
16    }
17 
18}

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

[代码]java代码:

01using UnityEngine;
02using System.Collections;
03 
04public 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'","'xuanyusong@gmail.com'","'www.xuanyusong.com'"   });
16        db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'000@gmail.com'","'www.xuanyusong.com'"   });
17        db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'111@gmail.com'","'www.xuanyusong.com'"   });
18 
19        //然后在删掉两条数据
20        db.Delete("momo",new string[]{"email","email"}, new string[]{"'xuanyusong@gmail.com'","'000@gmail.com'"}  );
21 
22        db.CloseSqlConnection();
23    }
24 
25}

***是查找数据。

[代码]java代码:

01using UnityEngine;
02using System.Collections;
03 
04using Mono.Data.Sqlite;
05public 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'","'xuanyusong@gmail.com'","'www.xuanyusong.com'"   });
17        db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'000@gmail.com'","'www.xuanyusong.com'"   });
18        db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'111@gmail.com'","'www.xuanyusong.com'"   });
19 
20        //然后在删掉两条数据
21        db.Delete("momo",new string[]{"email","email"}, new string[]{"'xuanyusong@gmail.com'","'000@gmail.com'"}  );
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代码:

01using UnityEngine;
02using System.Collections;
03 
04using Mono.Data.Sqlite;
05public 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'","'xuanyusong@gmail.com'","'www.xuanyusong.com'"   });
19        db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'000@gmail.com'","'www.xuanyusong.com'"   });
20        db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'111@gmail.com'","'www.xuanyusong.com'"   });
21 
22        //然后在删掉两条数据
23        db.Delete("momo",new string[]{"email","email"}, new string[]{"'xuanyusong@gmail.com'","'000@gmail.com'"}  );
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代码:

01using UnityEngine;
02using System.Collections;
03 
04using Mono.Data.Sqlite;
05public 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'","'xuanyusong@gmail.com'","'www.xuanyusong.com'"   });
21        db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'000@gmail.com'","'www.xuanyusong.com'"   });
22        db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'111@gmail.com'","'www.xuanyusong.com'"   });
23 
24        //然后在删掉两条数据
25        db.Delete("momo",new string[]{"email","email"}, new string[]{"'xuanyusong@gmail.com'","'000@gmail.com'"}  );
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代码:

01using UnityEngine;
02using System.Collections;
03 
04using Mono.Data.Sqlite;
05public 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'","'xuanyusong@gmail.com'","'www.xuanyusong.com'"   });
28        db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'000@gmail.com'","'www.xuanyusong.com'"   });
29        db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'111@gmail.com'","'www.xuanyusong.com'"   });
30 
31        //然后在删掉两条数据
32        db.Delete("momo",new string[]{"email","email"}, new string[]{"'xuanyusong@gmail.com'","'000@gmail.com'"}  );
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        }

本文题目:Unity3D研究之使用C#语言建立本地数据库
新闻来源:http://www.shufengxianlan.com/qtweb/news34/211934.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

63