Unity 制作登录功能02-创建和链接数据库(SQlite)

国际惯例:先看效果

1.SQlite是一种嵌入型数据库

在Unity开发游戏时使用SQLite有多种原因,以下是其中一些主要原因:

  1. 嵌入式数据库:SQLite是一个嵌入式数据库引擎,这意味着它不需要单独的服务器进程。这使得使用SQLite非常方便,并且可以轻松地在不同的平台和操作系统上使用。
  2. 易于使用:SQLite易于学习和使用,具有简洁的SQL语法和强大的功能。这使得开发者可以更快地构建和部署游戏,同时减少了对复杂的数据库系统的需求。
  3. 兼容性:SQLite具有跨平台的兼容性,可以在Windows、Mac、Linux、Android和iOS等不同平台上使用。这意味着使用SQLite可以减少游戏在不同平台上的差异,提高游戏的一致性。
  4. 安全性:SQLite支持事务和数据完整性,这使得它成为一种安全的数据库选择。它还提供了加密选项,可以保护存储在数据库中的敏感数据。
  5. 可扩展性、移植:SQLite具有很好的可扩展性,可以处理大量的数据和并发访问。这意味着使用SQLite可以满足游戏开发中的各种需求,包括存储大量的游戏数据和处理高并发的用户访问。
  6. 开源和免费:SQLite是开源的,可以免费使用和修改。此外,SQLite还具有很好的文档和社区支持,可以帮助开发者解决遇到的问

2.如何在服务器或者本地计算机安装SQLite 

SQLite Download Page 官网下载

根据操作系统下载

C盘创建文件夹,把下载的文件解压放进去

 sqlite3.def 只是为了支持本地计算机的CMD命令窗口可以访问的文件

3.如何在Unity中使用SQLite 

创建文件夹 (自己命名,原则就是自己能找到)

在自己电脑上搜这两个文件,复制到自己刚刚创建的文件夹Plugins 

  1. Mono.Data.Sqlite.dll

  2. sqlite3.dll

4.重启VS, 引用程序集即可!using Mono.Data.Sqlite;

5.学习该程序集的第一个类SQLiteConnection

SQLiteConnection是.NET Framework中的一个类,它是ADO.NET用于与SQLite数据库进行交互的主要接口之一。通过这个类,你可以执行SQL查询,修改数据库中的数据,处理数据库中的事务等等。

如果你需要使用SQLiteConnection,首先你需要确保你的项目已经引入了正确的SQLite .NET 包。你可以通过NuGet来添加这个包。在Visual Studio中,右击项目 -> "Manage NuGet Packages..." -> 搜索 "System.Data.SQLite" -> "Install"。

SQLiteConnection类的主要属性和方法有:

  • ConnectionString:用于定义数据库连接的字符串。
  • Open():打开数据库连接。
  • Close():关闭数据库连接。
  • Execute(SqlCommand command):执行一个SQL命令并返回受影响的行数。
  • BeginTransaction():开始一个数据库事务。
  • Commit():提交数据库事务。
  • Rollback():回滚数据库事务。

实战案例:用户注册

用户注册并存储账号密码到数据库

 两个脚本:

1.获取用户在UI界面输入的账号密码字符串
2.创建一个数据链接SQLite!创建一个表!把获取的账号密码插入数据库!

场景搭建:

1.获取用户在UI界面输入的账号密码字符串

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;public class UserLogin : MonoBehaviour
{// 该脚本获取场景中输入框组件2.获取用户输入内容 public TMP_InputField userInputFieldAccount;public TMP_InputField userInputFieldPassword;public GameObject inputkuang;public static string UserAccount;public static string UserPassword;void Start(){userInputFieldAccount.onEndEdit.AddListener(OnUserInputChanged);userInputFieldPassword = inputkuang.GetComponent<TMP_InputField>();userInputFieldPassword.onEndEdit.AddListener(OnUserInputPassword);}private void OnUserInputPassword(string password){Debug.Log("用户输入的密码是:" + password);UserPassword = password;}// Update is called once per frameprivate void OnUserInputChanged(string Account){// 当用户输入值发生改变时调用该方法Debug.Log("用户输入的注册:" + Account);UserAccount = Account;}public void Login()//该函数用来在外部登录按钮面板中触发{Debug.Log("面板上的函数触发成功,用户点击了注册按钮" + UserAccount + "  " + UserPassword);do{           ConnectDataSQL.GetUserInput(UserAccount, UserPassword);//调用另一个类的方法:插入数据库并存储Debug.Log("注册成功");        } while (false);}
}

2.创建一个数据链接SQLite!创建一个表!把获取的账号密码插入数据库!

using UnityEngine;
using System.Data;
using Mono.Data.Sqlite;public class ConnectDataSQL : MonoBehaviour
{private const string databaseName = "leoyang.db"; // 数据库文件名称static SqliteConnection MyConnectionDB;//创建一个数据库链接事件对象string UserAccount;string UserPassword;private void Start(){// 定义数据库连接字符串string connectionString = "URI=file:" + Application.dataPath + "/" + databaseName;// 创建数据库连接//传入创建或者访问SQLITE数据库的路径MyConnectionDB = new SqliteConnection(connectionString);if (MyConnectionDB.State == ConnectionState.Closed)//检测当前数据库链接状态是否关闭{MyConnectionDB.Open();//打开数据库Debug.Log("数据库链接完毕已打开");}else{Debug.Log("数据库连接失败");}// 创建数据库用户表(如果不存在)CreateTable(MyConnectionDB);     }// 创建用户表的方法private void CreateTable(SqliteConnection oneConnect){string sqlCreateTable = "CREATE TABLE IF NOT EXISTS UserTable (" +"Id INTEGER PRIMARY KEY AUTOINCREMENT," +"Username TEXT NOT NULL," +"Password TEXT NOT NULL" +");";SqliteCommand SQcommand = new SqliteCommand(sqlCreateTable, oneConnect);//数据库创建命令SQcommand.ExecuteNonQuery();SQcommand.Dispose();SQcommand = null;}public static void GetUserInput(string UserAccount, string UserPassword)//用户点击注册开始插入数据库{if (UserPassword!=null&&UserAccount!=null){InsertUser(UserAccount,UserPassword);}}// 插入用户输入的账号和密码的方法public static void InsertUser(string username, string password){string sqlCreateTable = "INSERT INTO UserTable (Username, Password) VALUES (@Username, @Password)";if (MyConnectionDB.State != ConnectionState.Open){MyConnectionDB.Open();Debug.Log("我为您重新打开了数据库");}else{SqliteCommand Insertuser = new SqliteCommand(sqlCreateTable, MyConnectionDB);Insertuser.Parameters.AddWithValue("@Username", username);Insertuser.Parameters.AddWithValue("@Password", password);//在 try 块中的代码执行期间,如果发生了异常,则会跳过后续的代码,并进入与异常类型匹配的 catch 块中进行处理。如果异常类型没有与任何 catch 块匹配,那么将会跳过所有的 catch 块,但仍然可以选择执行 finally 块。try{Insertuser.ExecuteNonQuery();Debug.Log("插入注册成功.");}catch (SqliteException yichang){Debug.LogError("插入注册失败 " + yichang.Message);}finally{// 释放资源和清理操作Insertuser.Dispose();Insertuser = null;MyConnectionDB.Close();}}Debug.Log("注册成功.");}// 读取用户表中的数据的方法// 每次执行完数据库命令后,通常需要调用 ExecuteNonQuery() 方法来执行命令,然后使用 Dispose() 方法释放相关资源,// 最后将对象置为 null。 public void ClearDB()//关闭数据库{MyConnectionDB.Close();MyConnectionDB = null;}
}

 PS 用完数据库要关闭和清空====================

 

这段代码是用于关闭数据库连接的方法。具体来说,MyConnectionDB.Close()表示关闭当前数据库连接,并释放与该连接关联的任何资源。而MyConnectionDB = null;则将数据库连接对象置为null,以便垃圾回收器可以在适当的时候将其回收。

关闭数据库连接对于提高应用程序性能和防止资源泄漏非常重要。如果没有正确关闭数据库连接,可能会导致连接池被占用过多而影响应用程序性能,或者导致系统资源不足而导致应用程序出现异常。

在使用完数据库连接后,应该及时关闭它,以便让其他应用程序能够通过连接池访问数据库。同时,将对象置为null也有助于垃圾回收器及时回收不再使用的资源,以提高应用程序的性能和稳定性。

总之,本段代码的作用是在关闭数据库连接后,将连接对象置为null,以便垃圾回收器可以及时回收资源。

最终效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/144482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建个人云存储:本地电脑搭建SFTP服务器,开启公网访问,轻松共享与管理个人文件!

本地电脑搭建SFTP服务器&#xff0c;并实现公网访问 文章目录 本地电脑搭建SFTP服务器&#xff0c;并实现公网访问1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内…

【算法与数据结构】JavaScript实现十大排序算法(一)

文章目录 关于排序算法冒泡排序选择排序插入排序希尔排序归并排序 关于排序算法 稳定排序&#xff1a; 在排序过程中具有相同键值的元素&#xff0c;在排序之后仍然保持相对的原始顺序。意思就是说&#xff0c;现在有两个元素a和b&#xff0c;a排在b的前面&#xff0c;且ab&…

十九,镜面IBL--BRDF积分贴图

再回顾下镜面部分的分割求和近似法 现在关注第二部分 最后可化为 也就是说&#xff0c;这两部分积分可以获得F0的系数和F0的偏差。 这两个值可以存储到BRDF积分贴图的RG部分。void main() { vec2 integratedBRDF IntegrateBRDF(TexCoords.x, TexCoords.y); FragColor …

图扑软件受邀亮相 IOTE 2023 国际物联网展

IOTE 2023 国际物联网展&#xff0c;作为全球物联网领域的盛会&#xff0c;于 9 月 20 日 - 22 日在中国深圳拉开帷幕。本届展会以“IoT构建数字经济底座”为主题&#xff0c;由深圳市物联网产业协会主办&#xff0c;打造当前物联网最新科技大秀。促进物联网与各行业深度融合&a…

ALM物联网管理平台助力中台上云 数字化转型让展示更直观清晰

支持移动浏览、支持大屏显示等功能&#xff0c;能够为设备厂家提供数据依据&#xff0c;方便厂家的售后以及产品的维护、为运维等相关公司提供运维管理等相关功能。 ALM物联网云平台是基于以往的物联网产品&#xff0c;以及目前市场上的各种云平台优点&#xff0c;研精心打造的…

排序:基数排序算法分析

1.算法思想 假设长度为n的线性表中每个结点aj的关键字由d元组 ( k j d − 1 , k j d − 2 , k j d − 3 , . . . , k j 1 , k j 0 ) (k_{j}^{d-1},k_{j}^{d-2},k_{j}^{d-3},... ,k_{j}^{1} ,k_{j}^{0}) (kjd−1​,kjd−2​,kjd−3​,...,kj1​,kj0​)组成&#xff0c; 其中&am…

缓存一致性(cache coherency)解决方案:MESI 协议状态转换详解

MESI 协议 一&#xff0c;MESI状态释义二&#xff0c;MESI状态转换1 Invalid after Reset2, Invalid > Exclusive3, Exclusive > Modified4 Modified > Shared, Invalid > Shared5 Shared > Invalid, Shared > Modified 三&#xff0c;状态转换场景总结Inval…

Linux常见指令2

Linux常见指令[2] 一.Linux常见指令1.man补充知识:nano 2.cp3.mv4.cat补充知识:echo输出重定向追加重定向回到catcat其他用法 5.less和more补充内容回到less 6.head和tail补充知识:命令行管道 一.Linux常见指令 前言:为了方便我们在Linux中写指令 介绍一下: 1.clear指令: 清屏…

【每日一题】2769. 找出最大的可达成数字

2769. 找出最大的可达成数字 - 力扣&#xff08;LeetCode&#xff09; 给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等&#xff0c;则称其为 可达成数字 &#xff1a; 每次操作将 x 的值增加或减少 1 &#xff0c;同时可以选择将 …

红黑树是如何实现的?

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …

基于SSM+Vue的医院住院综合服务管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ROS系统读取USB相机图像数据

ROS系统读取USB相机图像数据 前言usb_cam 功能包下载与编译摄像头选择连接摄像头可配置参数 前言 usb_cam功能包简介 为了丰富机器人与外界的交互方式&#xff0c;已经增加了与机器人的语音交互方式&#xff0c;不仅使机器人能够说话发声&#xff0c;还能听懂我们说的话&#…

Windows中实现将bat或exe文件作为服务_且实现命令行安装、配置、启动、删除服务

一、背景描述 在Windows环境下进行日常的项目开发过程中&#xff0c;有时候需要将bat文件或exe文件程序注册为Windows的服务实现开机自己运行&#xff08;没有用户登陆&#xff0c;服务在开机后也可以照常运行&#xff09;、且对于那些没有用户交互界面的exe程序来说只要在后台…

STL upper_bound和lower_bound函数

声明&#xff1a; 首先包含头文件#include<algorithm> 这里的两个函数所运用的对象必须是非递减的序列&#xff08;也就是数组&#xff0c;数组必须是非递减的&#xff09;&#xff0c;只有这样才可以使用upper_bound和lower_bound这两个函数。 还有一点&#xff0c;就…

Python入门教程48:Pycharm永久镜像源的pip配置方法

国内几个好用的Python镜像服务器地址&#xff1a; 清华大学镜像站&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/阿里云镜像站&#xff1a;https://mirrors.aliyun.com/pypi/simple/中科大镜像站&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/中国科技大学镜…

HTML5福利篇--使用Canvas画图

目录 一.Canvas元素 1.Canvas元素定义 2.使用JavaScript获取页面中的Canvas对象 二.绘制图形 1.绘制直线 2.绘制矩形 &#xff08;1&#xff09;rect() &#xff08;2&#xff09;strokeRect() &#xff08;3&#xff09;fillRect()和clearRect()函数 3.绘制圆弧 4.…

ElementUI之首页导航+左侧菜单->mockjs,总线

mockjs总线 1.mockjs 什么是Mock.js 前后端分离开发开发过程当中&#xff0c;经常会遇到以下几个尴尬的场景&#xff1a; - 老大&#xff0c;接口文档还没输出&#xff0c;我的好多活干不下去啊&#xff01; - 后端小哥&#xff0c;接口写好了没&#xff0c;我要测试啊&#x…

opencv: 解决保存视频失败的问题

摘要&#xff1a;opencv能读取视频&#xff0c;但保存视频时报错。 一、首先要确保已经下载了openh264.dll文件&#xff0c;否则保存的视频无法打开&#xff0c;详细可以浏览这个&#xff1a;opencv&#xff1a;保存视频。 二、保存视频时出现一下问题&#xff1a; OpenCV:…

COCO 数据集 人体关键点格式

图片与标注数据在 COCO官网 均提供下载 标注格式 COCO 的标注中包含 4 个部分/字段&#xff0c;"info" 描述数据集&#xff0c;"licenses" 描述图片来源&#xff0c;"images" 和 "annotations" 是主体部分 "images" 部分…

一文带你全面解析postman工具的使用

写在前面&#xff1a;本文转自今日头条作者雨滴测试&#xff0c;感兴趣可点击下方链接查看原文 基础篇效率篇高级篇 一文带你全面解析postman工具的使用 文章目录 一文带你全面解析postman工具的使用基础篇一、postman安装说明1.下载与安装2.界面导航说明3.发送第一个请求 二、…