PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为随缘更。
笔记内容均为 自己理解,不保证每个都对
PS:鸽了貌似有十天了,中途回了趟学校,然后回来就中秋~~~,咕咕咕是真的舒服~,近期会把欠的笔记陆续补上,学校项目还没写完,感觉头要秃。
数据库在游戏中是很经常用到的一个组件,就比如最最简单的登录方法,用户的账号密码等信息就是存在服务器的数据库中。每次用户进行登录操作时,就会访问数据库进行匹配。
本次博客只以简单的SQL语句为举例: 单表查询,插入,更新,删除。不涉及多表查询,触发器,视图权限赋予等。有兴趣的同学自行查阅相关书籍。
博主使用的 为MySQL,可视化软件为 NaviCat。
1、存储类
在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
文本类型:
数字类型:
使用方法:
tel text; //tel为自定义名字 text为数据类型
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,);
举例: primary key 表示主键, 即唯一标识符,不可为空
create table Person (
id integer primary key not null ,
name text not null,
sex integer ,
tel text );
3、数据库的基本操作:
增加insert
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
删除delete
DELETE FROM table_name
WHERE [condition];
修改update
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
查询select
SELECT column1, column2, columnN
FROM table_name;
WHERE [condition];
引入dll插件:
在u3d 安装目录可以找到
安装目录:Editor\Data\Mono\lib\mono\2.0
1,system.data.dll.
2, Mono.Data.Sqlite.dll
在sqlite 官网下载
3,sqlite3.dll
64位版本 根据 unity3d 版本
https://www.sqlite.org/download.html
补充说明:
ExecuteNonQuery():执行命令对象的SQL语句,返回一个int类型变量,如果SQL语句是对数据库的记录进行操作(如记录的增加、删除和更新),那么方法将返回操作所影响的记录条数。
ExecuteScalar():执行命令对象的SQL语句,如果SQL语句是SELECT查询,则仅仅返回查询结果集中的第1行第1列,而忽略其他的行和列。该方法所返回的结果为object类型,在使用之前必须强制转换为所需的类型。如果SQL语句不是SELECT查询,则返回结果没有任何作用。
ExecuteReader():我们通常在asp中用Recordset对象来从数据库中读出数据,并且用循环语句来一个一个的读出数据,但在我们的ADO.NET中,我们就是DataReader 对象的ExecuteReader()方法来进行数据的列出,并且我们用这个ExecuteReader()方法来显示数据是最快的一种方法,因为当我们在用ExecuteReader()方法中的DataReader 对象来进行数据的在网站建设中显示时,他只可以一条一条向前读,不能返回,也就是像ASP中的ADO方法中的Recordset 对象的Movenext一样,他没有move -1这样的返回方法。
说明:如果没有数据可操作,那么只能使用调用命令对象的ExecuteReader方法,返回一个数据读取器(DataReader对象)。因为 ExecuteNonQuery()与ExecuteScalar()在没有数据的时候调用时,就会出现“对象没有实例化”的错误。所以在判断是否有数据时,应该调用数据读取器的Read()方法来检测。
样例代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;
public class TestSql : MonoBehaviour
{
SqliteConnection myconnect;
// Start is called before the first frame update
void Start()
{
string path = "Data Source=" +Application.streamingAssetsPath + "/Test.db";
//连接数据库
myconnect = new SqliteConnection(path);
try
{
// 打开数据库。
myconnect.Open();
}
catch (System.Exception e)
{
Debug.Log("error=="+ e.Message);
}
// CreateTable();
}
void CreateTable()
{
//创建一个 sql 指令
SqliteCommand mycommond = myconnect.CreateCommand();
// 指定 sql 语句
mycommond.CommandText = "create table Person ( id integer primary key not null , name text not null , sex integer, tel text ); ";
//执行 数据语句
mycommond.ExecuteScalar();
}
void InsertInto()
{
//创建一个 sql 指令
SqliteCommand mycommond = myconnect.CreateCommand();
// 指定 sql 语句
mycommond.CommandText = "insert into Person (name,sex) values ('lisi',02); ";
//执行 数据语句
SqliteDataReader tmpReader= mycommond.ExecuteReader();
}
void Select()
{
//创建一个 sql 指令
SqliteCommand mycommond = myconnect.CreateCommand();
mycommond.CommandText = "select * from Person ;";
//执行 数据语句
SqliteDataReader tmpReader = mycommond.ExecuteReader();
/*
//tmpReader.Read() 从结果中读取 一条数据。 成功 返回true 读到没有数据了 false
while (tmpReader.Read())
{
int tmpId = tmpReader.GetInt32(0);
Debug.Log("tmpId =="+ tmpId);
string nameStr= tmpReader.GetString(1);
Debug.Log("nameStr ==" + nameStr);
int sexInt= tmpReader.GetInt32(2);
Debug.Log("sexInt ==" + sexInt);
}
*/
// 拆箱 。
while (tmpReader.Read())
{
for (int i = 0; i < 3; i++)
{
object tmpObj = tmpReader.GetValue(i);
Debug.Log("tmpObj ==" + tmpObj);
}
Debug.Log("==========");
}
}
void Delete()
{
//创建一个 sql 指令
SqliteCommand mycommond = myconnect.CreateCommand();
mycommond.CommandText = "delete from Person where id>5 ;";
//执行 数据语句
SqliteDataReader tmpReader = mycommond.ExecuteReader();
}
void UpdateSql()
{
//创建一个 sql 指令
SqliteCommand mycommond = myconnect.CreateCommand();
mycommond.CommandText = "update Person set tel='123456' where id <5 ;";
//执行 数据语句
SqliteDataReader tmpReader = mycommond.ExecuteReader();
}
private void OnApplicationQuit()
{
myconnect.Close();
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.A))
{
InsertInto();
}
if(Input.GetKeyDown(KeyCode.B))
{
Select();
}
if(Input.GetKeyDown(KeyCode.C))
{
Delete();
}
if(Input.GetKeyDown(KeyCode.D))
{
UpdateSql();
}
}
}