【Unity 32】 Unity中的数据库

PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为随缘更。
笔记内容均为 自己理解,不保证每个都对

PS:鸽了貌似有十天了,中途回了趟学校,然后回来就中秋~~~,咕咕咕是真的舒服~,近期会把欠的笔记陆续补上,学校项目还没写完,感觉头要秃。

Part 1 数据库基础:

数据库在游戏中是很经常用到的一个组件,就比如最最简单的登录方法,用户的账号密码等信息就是存在服务器的数据库中。每次用户进行登录操作时,就会访问数据库进行匹配。
本次博客只以简单的SQL语句为举例: 单表查询,插入,更新,删除。不涉及多表查询,触发器,视图权限赋予等。有兴趣的同学自行查阅相关书籍。

博主使用的 为MySQL,可视化软件为 NaviCat。

1、存储类
在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
文本类型:
【Unity 32】 Unity中的数据库_第1张图片

数字类型:

【Unity 32】 Unity中的数据库_第2张图片

时间类型:
【Unity 32】 Unity中的数据库_第3张图片

使用方法:

tel   text;	//tel为自定义名字          text为数据类型

2、表
表是数据库中必不可少的一部分【Unity 32】 Unity中的数据库_第4张图片
创建表:

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];

Part 2 在Unity中使用MySQL:

引入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();

        }
        
    }
}

你可能感兴趣的:(Unity)