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

news2024/10/7 9:17:07

国际惯例:先看效果

 

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 frame

    private 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.coloradmin.cn/o/1038406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP/IP协议,IPV4,IPV6,为什么国家大力倡导IPV6的发展

简单回顾一下TCP的特点 TCP是可靠性&#xff0c;UDP是负责效率&#xff0c;那么如何基于UDP实现可靠传输 本质还是考察TCP 目录 TCP/IP协议栈&#x1f49b; 那么假如IP地址不够用怎么办呢&#xff1f;NAT机制&#x1f499; IP地址的介绍&#x1f49c; TCP/IP协议栈&#…

腾讯mini项目-【指标监控服务重构】2023-08-28

今日已办 分工 测试 - 谢雨晨、郑兆隆将1的测试结果记录整理为一个表格&#xff0c;列有&#xff1a;平均内存、最大内存、95内存、cpu的这些等等 - 邓烨钒HyperScan和官方正则库的benchmark对比 - 张锐添PPT制作 - 其他人灵活调动 进度 trace上报&#xff1a;jaeger-colle…

【星穹杂谈】为什么寰宇蝗灾难到折磨玩家却令玩家一致好评?

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天咱们不聊技术&#xff0c;来聊聊一些游戏里我个人觉得有趣的东西&#xff0c;今天想和大家聊聊关于星穹铁道这个版本新出的活动寰宇蝗灾为什…

题目 1067: 二级C语言-分段函数 sqrt、fabs、pow

一个分段函数&#xff0c;返回为double值&#xff0c;保留两位小数。 输入5 输出15.00 这题不难&#xff0c;重要的是sqrt(),fabs(),pow(n,2); cmath或者math.h里有的sqrt() 平方根函数&#xff0c;fabs()绝对值函数&#xff0c;pow(n,5); nの五次方函数 #include<iostrea…

【数据结构】泛型

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 泛型 1. 包装类1.1 基本数据类型和对应的…

【Javascript保姆级教程】Javascript数据类型和算术运算符

文章目录 前言一、JavaScript数据类型1.1 数字&#xff08;Number&#xff09;1.2 字符串&#xff08;String&#xff09;1.3 布尔&#xff08;Boolean&#xff09;1.4 数组&#xff08;Array&#xff09;1.5 类(Object) 二、算术运算符2.1 加法&#xff08;&#xff09;2.2 减…

单目3D目标检测——SMOKE 环境搭建|模型训练

本文分享SMOKE最新的版本的环境搭建&#xff0c;以及模型训练&#xff1b;环境关键库版本&#xff1a;pytorch 1.12.0、CUDA 11.3、cudnn 8.3.2、python 3.7、DCNv2。 目录 1、docker 获取Nvidia 镜像 2、安装Conda 3、创建SMOKE环境 4、编译SMOKE环境 5、下载kitti 3D目标…

Springboot+vue的校园资产管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的校园资产管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的校园资产管理系统&#xff0c;采用M&#xff…

让Pegasus天马座开发板实现超声波测距

在完成《让Pegasus天马座开发板用上OLED屏》后&#xff0c;我觉得可以把超声波测距功能也在Pegasus天马座开发板上实现。于是在箱子里找到了&#xff0c;Grove - Ultrasonic Ranger 这一超声波测传感器。 官方地址: https://wiki.seeedstudio.com/Grove-Ultrasonic_Ranger 超声…

使用postcss-pxtorem插件实现px转换rem

1.下载postcss-pxtorem(其他插件按需下载自行配置)并在package.json同级目录下新建postcss.config.js文件: export const defaultHtmlFontSize 37.5 export default {plugins: {autoprefixer: {overrideBrowserslist: [Android > 4.0, iOS > 7],},postcss-pxtorem: {//…

tensorrt获取输入输出

利用Netron打开onnx&#xff0c;右边名字&#xff1a; int input_index engine->getBindingIndex("inout1.1");int output_index engine->getBindingIndex("191");

NSSCTF做题

[第五空间 2021]WebFTP 打开题目 发现是登录的界面 用admin和password试一下发现不行 用dirsearch扫一下 发现了git泄露 但是用githack下载不下来文件 去网上查了一下webftp 发现是一个在线php文件管理系统 WebFTP——在线FTP工具:强大的PHP在线文件管理系统-時日 在这篇博客…

CentOS7平台命令安装Anaconda3、配置Python3开发环境

要在 CentOS 7 上安装 Anaconda3&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 下载 Anaconda3 安装包&#xff1a; 首先&#xff0c;访问 Anaconda 官方网站以获取最新版本的 Anaconda3 安装包的下载链接。可以使用 wget 命令来下载安装包。请确保选择适用于 Cent…

数字IC设计系列----单端口RAM、双端口RAM

一、单端口RAM原理及实现 1.1、概念/原理 在内存空间中开辟出一段固定大小的内存用于存储数据&#xff0c;每一个数据所占的bit位称之为位宽&#xff0c;这段内存空间中数据的总数称之为深度。例如reg [7:0] mem [255:0]&#xff0c;这段内存空间中每一个数据的位宽为8bit&am…

postgresql用户和角色

postgresql用户和角色 简述创建角色角色属性登录特权超级用户创建数据库创建角色启动复制密码修改角色属性 对象授权撤销授权组和成员删除角色 简述 PostgreSQL 通过角色的概念来控制数据库的访问权限。角色又包含了两种概念&#xff0c;具有登录 权限的角色称为用户&#xff…

Nature Communications | 张阳实验室:端到端深度学习实现高精度RNA结构预测

RNA分子是基因转录的主要执行者&#xff0c;也是细胞运作的隐形功臣。它们在基因表达调控、支架构建以及催化活性等多个生命过程中都扮演着关键角色。虽然RNA如此重要&#xff0c;但由于实验数据的缺乏&#xff0c;准确预测RNA 的三维空间结构仍然是目前计算生物学面临的重大挑…

Flink 内存模型

Jobmanage内存模型 1G 1C 的配置 上图不够直观,用户大脑无法第一反应出内存构成。 Total Process Memory = JVM堆内存 + JVM堆外内存(堆外内存+ JVM元空间 +JVM自身运行内存) Total Flink Memory = JVM堆内存 + 堆外内存 参数控制: Total Process Memory 对应 jobmanag…

2023 “华为杯” 中国研究生数学建模竞赛(C题)深度剖析|数学建模完整代码+建模过程全解全析

华为杯数学建模C题 当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2021年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看研赛的C题呀~&#xff01; 问…

二十四、MySQL事务操作演示

1、事务 &#xff08;1&#xff09;事务简介&#xff1a; &#xff08;2&#xff09;实际操作方式&#xff1a; 在执行MySQL语句时&#xff0c;系统默认自动提交&#xff0c;但是语句一旦出现报错&#xff0c;就可能导致数据出现大规模错误&#xff0c;所以我们要做的就是&…

牛客网解题之跳台阶

10.3 跳台阶 题目链接 牛客网 题目描述 一只青蛙一次可以跳上 1 级台阶&#xff0c;也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 解题思路 当 n 1 时&#xff0c;只有一种跳法&#xff1a; 当 n 2 时&#xff0c;有两种跳法&#xff1a; 跳 n 阶台…