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 ("账号未注册");
}
}
}