• 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界面输入的账号密码字符串

    1. using System;
    2. using System.Collections;
    3. using System.Collections.Generic;
    4. using TMPro;
    5. using UnityEngine;
    6. public class UserLogin : MonoBehaviour
    7. {
    8. // 该脚本获取场景中输入框组件2.获取用户输入内容
    9. public TMP_InputField userInputFieldAccount;
    10. public TMP_InputField userInputFieldPassword;
    11. public GameObject inputkuang;
    12. public static string UserAccount;
    13. public static string UserPassword;
    14. void Start()
    15. {
    16. userInputFieldAccount.onEndEdit.AddListener(OnUserInputChanged);
    17. userInputFieldPassword = inputkuang.GetComponent();
    18. userInputFieldPassword.onEndEdit.AddListener(OnUserInputPassword);
    19. }
    20. private void OnUserInputPassword(string password)
    21. {
    22. Debug.Log("用户输入的密码是:" + password);
    23. UserPassword = password;
    24. }
    25. // Update is called once per frame
    26. private void OnUserInputChanged(string Account)
    27. {
    28. // 当用户输入值发生改变时调用该方法
    29. Debug.Log("用户输入的注册:" + Account);
    30. UserAccount = Account;
    31. }
    32. public void Login()//该函数用来在外部登录按钮面板中触发
    33. {
    34. Debug.Log("面板上的函数触发成功,用户点击了注册按钮" + UserAccount + " " + UserPassword);
    35. do
    36. {
    37. ConnectDataSQL.GetUserInput(UserAccount, UserPassword);//调用另一个类的方法:插入数据库并存储
    38. Debug.Log("注册成功");
    39. } while (false);
    40. }
    41. }

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

    1. using UnityEngine;
    2. using System.Data;
    3. using Mono.Data.Sqlite;
    4. public class ConnectDataSQL : MonoBehaviour
    5. {
    6. private const string databaseName = "leoyang.db"; // 数据库文件名称
    7. static SqliteConnection MyConnectionDB;//创建一个数据库链接事件对象
    8. string UserAccount;
    9. string UserPassword;
    10. private void Start()
    11. {
    12. // 定义数据库连接字符串
    13. string connectionString = "URI=file:" + Application.dataPath + "/" + databaseName;
    14. // 创建数据库连接
    15. //传入创建或者访问SQLITE数据库的路径
    16. MyConnectionDB = new SqliteConnection(connectionString);
    17. if (MyConnectionDB.State == ConnectionState.Closed)//检测当前数据库链接状态是否关闭
    18. {
    19. MyConnectionDB.Open();//打开数据库
    20. Debug.Log("数据库链接完毕已打开");
    21. }
    22. else
    23. {
    24. Debug.Log("数据库连接失败");
    25. }
    26. // 创建数据库用户表(如果不存在)
    27. CreateTable(MyConnectionDB);
    28. }
    29. // 创建用户表的方法
    30. private void CreateTable(SqliteConnection oneConnect)
    31. {
    32. string sqlCreateTable = "CREATE TABLE IF NOT EXISTS UserTable (" +
    33. "Id INTEGER PRIMARY KEY AUTOINCREMENT," +
    34. "Username TEXT NOT NULL," +
    35. "Password TEXT NOT NULL" +
    36. ");";
    37. SqliteCommand SQcommand = new SqliteCommand(sqlCreateTable, oneConnect);//数据库创建命令
    38. SQcommand.ExecuteNonQuery();
    39. SQcommand.Dispose();
    40. SQcommand = null;
    41. }
    42. public static void GetUserInput(string UserAccount, string UserPassword)//用户点击注册开始插入数据库
    43. {
    44. if (UserPassword!=null&&UserAccount!=null)
    45. {
    46. InsertUser(UserAccount,UserPassword);
    47. }
    48. }
    49. // 插入用户输入的账号和密码的方法
    50. public static void InsertUser(string username, string password)
    51. {
    52. string sqlCreateTable = "INSERT INTO UserTable (Username, Password) VALUES (@Username, @Password)";
    53. if (MyConnectionDB.State != ConnectionState.Open)
    54. {
    55. MyConnectionDB.Open();
    56. Debug.Log("我为您重新打开了数据库");
    57. }
    58. else
    59. {
    60. SqliteCommand Insertuser = new SqliteCommand(sqlCreateTable, MyConnectionDB);
    61. Insertuser.Parameters.AddWithValue("@Username", username);
    62. Insertuser.Parameters.AddWithValue("@Password", password);
    63. //在 try 块中的代码执行期间,如果发生了异常,则会跳过后续的代码,并进入与异常类型匹配的 catch 块中进行处理。如果异常类型没有与任何 catch 块匹配,那么将会跳过所有的 catch 块,但仍然可以选择执行 finally 块。
    64. try
    65. {
    66. Insertuser.ExecuteNonQuery();
    67. Debug.Log("插入注册成功.");
    68. }
    69. catch (SqliteException yichang)
    70. {
    71. Debug.LogError("插入注册失败 " + yichang.Message);
    72. }
    73. finally
    74. {
    75. // 释放资源和清理操作
    76. Insertuser.Dispose();
    77. Insertuser = null;
    78. MyConnectionDB.Close();
    79. }
    80. }
    81. Debug.Log("注册成功.");
    82. }
    83. // 读取用户表中的数据的方法
    84. // 每次执行完数据库命令后,通常需要调用 ExecuteNonQuery() 方法来执行命令,然后使用 Dispose() 方法释放相关资源,
    85. // 最后将对象置为 null。
    86. public void ClearDB()//关闭数据库
    87. {
    88. MyConnectionDB.Close();
    89. MyConnectionDB = null;
    90. }
    91. }

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

     

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

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

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

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

    最终效果:

  • 相关阅读:
    Linux 如何排查网络问题
    AI与传统数据库 - ChatGPT风过之后 | 从Duet AI说开来
    LeetCode每日一题——2520. Count the Digits That Divide a Number
    OWASP top10 的介绍
    2022.07.29 Linux矩阵键盘驱动开发笔记2
    Xray的简单使用
    设计模式之原型模式
    【uniapp】小程序开发,初始化项目vscode
    Intent传大数据的深入分析
    java集合之List接口实现类常用方法详解
  • 原文地址:https://blog.csdn.net/leoysq/article/details/133239275