? ?sql本地數據庫 是在unity3d初學階段必會的技能 在練習自我項目的時候 時常用到本地注冊登入功能 這篇文章就簡單的介紹下如何使用 混合正則表達式注冊
按步驟來 本demo例子 用的是面向過程介紹的 所以沒有封裝性
1. 第一步 創建Plugins文件夾 導入sal必要插件Mono.Data.Sqlite.dll 和System.Data.dll?
2. 自我封裝一個小型可以增刪改查的SqlManager 提供一個單例供外部調用
3. 下面開始步驟
一、sqlManager 小型封裝
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System ;
using Mono.Data.Sqlite;
public class SqliteMangeToCSharp : MonoBehaviour {
//統一存在在Application.dataPath大文件夾下
// sqlite單例
public static SqliteMangeToCSharp _instance ;
public static SqliteMangeToCSharp GetInstance()
{
if (_instance == null) {
_instance = new SqliteMangeToCSharp ();
}
return _instance ;
}
// 數據庫連接類
SqliteConnection con ;
// 創建表類
public SqliteCommand command ;
// 創建的數據庫名和表名、存的數據
public string DatabaseName ;
bool isOpen = false;
void Awake()
{
}
void Start()
{
// 創數據庫名 和表、存儲數據類型
//string path = "/Data/lzy.db";
//string tableName = "LZY(age integer primary key autoincrement,name text,score integer)";
//CreateDatabase(path,tableName);
// 增加數據
//string tableNameAndData = "LZY(name,score) values('劉籽繇,59)";
//InsertData(tableNameAndData,path);
// 查找數據
// 2.1 查找所有數據
// 2.2 根據條件查找數據
// 2.1
//string tableNameDataAll = "LZY";
//selectTaleDataAll(tableNameDataAll,path);
// 2.2
//string tableNameDataAndCondition = "USER where name="+" '"+NameField.text + "'";
//selectTableDataCondition(tableNameDataAndCondition,path);
// 刪除數據
// 1.1 刪除數據庫
// 1.2 根據條件刪除數據
// 1.1
//string dataName = "LZY" ;
//dropTableData(dataName);
// 1.2
// TableName 是表名
// //string tableNameData ="LZY where name = '劉籽繇'";
//deleteTableData(tableNameData);
// 修改數據
//string tableNmaeDataUpdate = "LZY set name = '小' where name='小龍'";
//updateTableData(tableNmaeDataUpdate);
}
#region
// 創建數據庫 創建表
// path 是創建數據庫所在的路徑和名字 如Assess文件夾下Data文件夾下數據庫名為data.db
// tableName 是創建表的名字和參數列表
public void CreateDatabase(string path,string tableName)
{
con = new SqliteConnection("Data Source="+Application.dataPath+path);
// 打開數據庫
con.Open();
isOpen = true;
// 創建表
DatabaseName = "create table if not exists"+" "+tableName ;
command = new SqliteCommand(DatabaseName,con);
//執行命令
Order();
}
#endregion
#region
// 增加數據
// TableNameAndData 是表的名字和插入的具體數據 path是路徑比如說 /Data/user.db
public void InsertData(string tableNameAndData,string path)
{
con = new SqliteConnection("Data Source="+Application.dataPath+path);
// 打開數據庫
con.Open();
string sqlStr = "insert into"+" "+tableNameAndData;
command = new SqliteCommand(sqlStr,con);
Order();
}
#endregion
#region
// 2.2
// tableNameDataAndCondition是表明與查找的條件
// path是數據庫的路徑
// Example
// string UserNameOne = "USER where name="+" '"+NameField.text + "'";
// 開始查找 count =1 代表找到了一條相關的 代表已經注冊 返回0代表沒有注冊
//int count = SqliteManage.Instance.selectTableDataCondition(UserNameOne,path);
public int selectTableDataCondition(string tableNameDataAndCondition,string path)
{
string sqlStr = "SELECT * FROM"+" "+tableNameDataAndCondition;
con = new SqliteConnection ("Data Source=" + Application.dataPath + path);
// 打開數據庫 非常重要
con.Open ();
command = new SqliteCommand(sqlStr,con);
int count = Convert.ToInt32(command.ExecuteScalar());
Order();
// 關閉數據庫
CloseDatabase ();
// 根據count的返回值來判斷當前賬號存不存在 count等于1就代表有此賬號
return count ;
}
#endregion
#region
//string UserName = "USER where name="+" '"+NameField.text+"'";
public SqliteDataReader selectTaleDataAll(string TableName,string path)
{
con = new SqliteConnection("Data Source="+Application.dataPath+path);
// 打開數據庫
con.Open();
string sqlStr = "SELECT * FROM"+" "+TableName;
command = new SqliteCommand(sqlStr,con);
SqliteDataReader reader = command.ExecuteReader ();
// 在驗證用戶密碼的時候用到
//if (name == reader.GetString (1) && psw == reader.GetString (2))
return reader;
}
#endregion
#region
// 1.1刪除數據庫
// DataName 是數據庫名
public void DropTableData(string DataName)
{
string sqlStr= "drop database"+" "+DataName ;
command = new SqliteCommand(sqlStr,con);
Order();
}
#endregion
#region
// 修改指定的數據 比如說存了 age name 現在可以選擇修改名字和年齡
// TableNameDataUpdate是表名 和要修改的數據 和新數據
public void updateTableData(string TableNameDataUpdate)
{
string sqlStr = "update"+" "+TableNameDataUpdate ;
command = new SqliteCommand(sqlStr,con);
Order();
}
#endregion
#region
// 關閉數據庫操作
public void CloseDatabase()
{
if (con != null) {
con.Close ();
}
}
#endregion
#region
// 創 增 刪 改 所要執行的命令
public void Order()
{
command.ExecuteNonQuery();
command.Dispose();
}
#endregion
}
二、注冊界面代碼 密碼設置沒有添加正則表達式判定 只有賬號添加了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Collections.Generic ;
using System ;
using UnityEngine.UI ;
using Mono.Data.Sqlite;
public class RegistereBg : MonoBehaviour {
public static RegistereBg _instance;
public static RegistereBg getInstance()
{
if (_instance == null)
{
_instance = new RegistereBg ();
}
return _instance;
}
#region 驗證所需屬性////// 正則表達式郵箱驗證規則
///public? string regularEmail = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?"; ??
?////// 正則表達式手機驗證規則 13是13開頭 然后后面是0-9任意數字 一共除了13后面還有9位數字
///public? string regularPhone = "13[0-9]{9}";////// 正則表達式密碼驗證規則? 要有字母與數組結合 最小8位 最大15位
///public? string regularPwd = "^[0-9A-Za-z]{6,15}$";
[Tooltip("是不是郵箱或者手機號碼 密碼規則對不對")]
public? bool userNameIsRegular = false;public? bool pwdIsRegular = false;
#endregion
#region 所需拿到的ui控件
public InputField nameField ;
public InputField pwdField ;
#endregion
#region
// 創建數據庫的路徑以及名字
public string path = "/SqlData/user.db" ;
// 創建表 表的名字 以及參數
string tableName = "USER(uid integer primary key autoincrement,name text,password text)";
#endregion
#region 注冊成功要重新回到登入界面
public GameObject login_bg ;
#endregion
void Awake()
{
// 游戲運行 注冊界面不顯示
gameObject.SetActive(false) ;
login_bg = GameObject.FindWithTag ("login_bg");
}
// Use this for initialization
void Start ()
{
// 創建數據庫
SqliteMangeToCSharp.GetInstance ().CreateDatabase (path,tableName);
}
// Update is called once per frame
void Update () {
}
#region 驗證輸入合不合法的回調
//先驗證是不是手機 不是接著再驗證是不是郵箱
public string BeginRegularPlayer(string sender,string regularPhone,string regularEmail)
{
if (System.Text.RegularExpressions.Regex.IsMatch(sender, regularPhone))
{
Debug.Log ("驗證手機");
return "isPhone" ;
}
else
{
if (System.Text.RegularExpressions.Regex.IsMatch (sender, regularEmail)) {
return "isEmail";
} else
{
return "NULL";
}
}
}
//密碼驗證
public? bool BeginRegularPwd(string sender,string regularPwd){
if (System.Text.RegularExpressions.Regex.IsMatch (sender, regularPwd))
{
return true;
}
else
{
return false;
}
}
#endregion
#region 注冊按鈕的調用方法
public void RegisBtn()
{
// 1. 先判斷輸入的賬號合不合法
// 2. 合法就判斷該賬號存不存在 不存在就注冊
string isLegal = BeginRegularPlayer (nameField.text,regularPhone,regularEmail) ;
if (isLegal == "isPhone" || isLegal == "isEmail") {
Debug.Log ("賬號輸入合法 可以注冊");
} else
{
Debug.Log ("不合法 重新輸入 也沒有必接下來的步驟了");
return;
}
// 2.
string UserNameOne = "USER where name="+" '"+nameField.text + "'";
int count = SqliteMangeToCSharp.GetInstance ().selectTableDataCondition (UserNameOne,path);
if (count > 0) {
// 已經被注冊 提示出現
Debug.Log ("注冊失敗 已經被注冊");
} else
{
SqliteMangeToCSharp.GetInstance ().InsertData (string.Format("USER(name,password) values('{0}','{1}')",nameField.text,pwdField.text),path);
Debug.Log("注冊成功");
gameObject.SetActive(false) ;
// login_bg.SetActive (true);
}
}
#endregion
}
三、登入界面賬號密碼驗證
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI ;
using Mono.Data.Sqlite;
public class LoginBg : MonoBehaviour {
public GameObject registere_bg ;
#region
public InputField nameField;
public InputField pwdField;
////// 正則表達式郵箱驗證規則
public? string regularEmail = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?";
////// 正則表達式手機驗證規則 13是13開頭 然后后面是0-9任意數字 一共除了13后面還有9位數字
///public? string regularPhone = "13[0-9]{9}";
// 創建數據庫的路徑以及名字
public string path = "/SqlData/user.db" ;
#endregion
void Awake()
{
gameObject.SetActive (false);
registere_bg = GameObject.FindWithTag ("registereBg");
}
void Start () {
}
// Update is called once per frame
void Update () {
}
// 登入界面注冊按鈕的回調
public void RegisBtn()
{
registere_bg.SetActive (true);
}
// 登入按鈕的回調
public void LoginBtn()
{
string isLegal = RegistereBg.getInstance().BeginRegularPlayer (nameField.text,regularPhone,regularEmail) ;
if (isLegal == "isPhone" || isLegal == "isEmail") {
Debug.Log ("賬號輸入合法");
} else
{
Debug.Log ("不合法 重新輸入 ");
return;
}
// 2.
string UserNameOne = "USER where name="+" '"+nameField.text + "'";
int count = SqliteMangeToCSharp.GetInstance ().selectTableDataCondition (UserNameOne,path);
// 賬號存在 去驗證密碼
if (count > 0)
{
// 查找是否有這個賬號 且密碼是否一致
string UserName = "USER where name="+" '"+nameField.text+"'";
Debug.Log (count);
SqliteDataReader reader = SqliteMangeToCSharp.GetInstance().selectTaleDataAll (UserName,path);
Debug.Log (count);
while (reader.Read ()) {
string name = nameField.text;
string psw = pwdField.text;
if (name == reader.GetString (1) && psw == reader.GetString (2)) {
Debug.Log ("登入成功");
//reader.Close ();
} else {
Debug.Log ("密碼錯誤");
}
}
}
else {
Debug.Log ("賬號未注冊");
}
}
}