展会信息港展会大全

使用C#语言来在MAC操作系统下创建Unity本地数据库
来源:互联网   发布日期:2016-01-19 11:20:38   浏览:5930次  

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

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

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

以前在开发中一直使用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代码:

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'","'xuanyusong@gmail.com'","'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", "'xuanyusong@gmail.com'");

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'","'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代码:

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'","'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代码:

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'","'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代码:

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'","'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代码:

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'","'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

}

63

64

if(appDBPath != null)

65

{

66

GUILayout.Label("数据库的路径" + appDBPath);

67

}

68

69

}

70

71

}

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

Windows平台SQLite的使用:

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

进入正题,还是先修改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

stringname = null;

11

stringemail = 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'","'xuanyusong@gmail.com'","'www.xuanyusong.com'"});

31

db.InsertInto("momo", new string[]{ "'雨松MOMO'","'289187120'","'000@gmail.com'","'www.xuanyusong.com'"});

32

db.InsertInto("momo", new string[]{ "'哇咔咔'","'289187120'","'111@gmail.com'","'www.xuanyusong.com'"});

33

34

//然后在删掉两条数据

35

db.Delete("momo",new string[]{"email","email"}, new string[]{"'xuanyusong@gmail.com'","'000@gmail.com'"});

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该文件夹是自动生 成的。

赞助本站

人工智能实验室

相关热词: C MAC Unity 数据库

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港