数据库框架
数据库共6个操作,连接数据库,建表,增,删,改,查,
此为两个工具类
一、字段属性准备
1、 public static readonly SQLiteManager Instance = new SQLiteManager();
2、构造方法用protectedprotected SQLiteManager() {}
3、定义一个字符串,用来存储数据库路径private string databasePath;
4、定义三个类的private变量
private SqliteConnection con;
private SqliteCommand command;
private SqliteDataReader reader;
二、封装方法
1、连接到指定数据库,并打开
///
/// 连接到指定数据库,并打开它.
///
/// 数据库名称.
public void OpenDatabase(string databasename)
{
//动态添加后缀
if (!databasename.EndsWith (".sqlite")) {
databasename += ".sqlite";
}
//填写路径
databasePath = "Data Source = " + Application.streamingAssetsPath
+ "/" + databasename;
Try{
//实例化连接对象,连接数据库
con = new SqliteConnection (databasePath);
//打开连接
con.Open ();
//创建指令对象
command = con.CreateCommand ();
}catch(SqliteException e)
{
Debug.logWarning(“连接数据库失败:”+e.ToString());
}
}
1.1、定义一个public,返回值void方法OpenDataBase,参数为string dataBaseName(数据库名)
1.2、判断参数(数据库名)是否以.sqlite为结尾,如果不是,动态添加//动态添加后缀
if (!databasename.Contains (".sqlite")) {
databasename += ".sqlite";
}
1.3、填写路径
//填写路径
databasePath = "Data Source = " + Application.streamingAssetsPath+ "/" + databasename;
"Data Source = "为固定格式,动态数据放在streamingAssets文件夹
1.4、实例化连接对象,把数据库路径传给con
//实例化连接对象
con = new SqliteConnection (databasePath);
1.5、打开数据库
Con.Open();
1.6、创建指令对象,用command接收
command=con.CreateCommand();
2、封装关闭数库据方法
定义一个public,void返回值,无参的CloseDataBase方法
判断如果数据库已经连接,可以关闭
public void Close()
{
if (con != null) {
con.Close ();
}
}
在析构方法中关闭数据库,也就是说在脚本生命周期结束的最后一瞬间关闭数据库
3、封装增删改操作方法
定义一个public,void返回值,参数为string(方法体内要执行的SQL语句)的方法
public int ExecuteNonQuery(string sqlQuery)
{
//设置SQL语句
command.CommandText = sqlQuery;
try {
//执行SQL语句
return command.ExecuteNonQuery();
} catch (System.Exception ex) {
//抛出异常
Debug.Log (“执行SQL语句异常:”+ex.ToString());
return 0;
}
}
方法体内先设置sql语句->执行SQL语句,执行SQL语句时可能出错,通过try{}catch(){}捕获一下异常
4、封装查询所有数据的方法
定义一个public,返回值list
在方法内先声明一个返回值类型的集合,用来存储执行SQL语句查询到的结果,用while()循环遍历表中的数据,查询到的每一条数据以键值对的形式存储起来
用SqliteDataReader.FieldCount属性拿到当前这一行数据的列数,用for循环遍历读到这一行的所有列,并将所有数据添加到键值对集合中。
而后再把这个键值对集合添加到外层集合(返回值的外层集合)
在while循环外关闭SqliteDataReader对象
由于以上操作可能出现异常,所以用try{}catch(){}捕获一下异常。
把添加好的list
public List
{
// 存储所有查询结果的集合, 查询到的每一条数据以键值对的形式存在
List
command.CommandText = sql;
try
{
reader = command.ExecuteReader();
while (reader.Read())
{
// 说明读到了一行数据, 将这一行数据做成键值对
Dictionary item = new Dictionary();
for (int i = 0; i < reader.FieldCount; i++)
{
// 将列名和列的值存到Item中
item.Add(reader.GetName(i), reader.GetValue(i));
}
// 添加一行数据到集合中
result.Add(item);
}
reader.Close();
}
catch (SqliteException e)
{
Debug.LogWarning("数据查询异常: " + e.ToString());
}
return result;
}
三、第一个工具类封装->打开、关闭数据库方法,连接到指定数据库方法,执行一个查询语句方法,执行查询所有数据方法。
打开数据库在连接到指定数据库方法中的创建操作指令对象后调用,关闭数据库在析构方法中调用.
连接到指定数据库、执行一个非查询语句,查询所有数据等3个方法都以SQL语句为参数,在第二个工具类里调用,并传一个SQL语句。
四、第二个工具类
1、设置为单例脚本
public static readonly new SQLiteTool Instance = new SQLiteTool();
2、定义一个加载数据库方法,方法体内调用父类加载数据库方法,并把数据库名字传参,在私有化的构造方法内调用此加载数据库方法,意思是用到此工具类的时候先创建并链接数据库。
3、建表。
定义一个建表方法,用常量字段作为表名和表字段名
private void CreateTable()
{
ExecuteNonQuery(string.Format("create table if not exists {0}({1} integer primary key, {2} integer);", Utlity.TableName, Utlity.KEY_LevelID, Utlity.KEY_LevelStar));
}
4、定义一个常量类,用来做数据库表和字段
static class Utlity
{
public static readonly string TableName = "Level";
public static readonly string KEY_LevelID = "LevelID";
public static readonly string KEY_LevelStar = "LevelStar";
}
5、定义一个信息类,用来给表内的字段赋值,此时假设表内只有两个字段
public class Info
{
public int id;
public int star;
public Info(int id, int star)
{
this.id = id;
this.star = star;
}
}
6、封装AddInfo方法,用来增加一条表中数据
public void AddInfo(Info info)
{
ExecuteNonQuery(string.Format("insert into {0} values ({1}, {2})", Utlity.TableName, info.id, info.star));
}
6、封装一个AddInfo的重载方法,方便不同情况下增加一条表中的数据。在此方法中调用上面方法,并传参,实现通过表中一条数据需要的值来添加一条信息,也可以再封装几个重载方法,用来添加没有所有字段值的一条数据。
public void AddInfo(int id, int star)
{
AddInfo(new Info(id, star));
}
7、封装一个修改数据的方法,返回值为void,参数为表中一条数据对应的值(根据情况自行设置),方法体内调用第一个工具类中的执行一条非查询语句的方法
public void UpdateInfo(int id, int newStar)
{
ExecuteNonQuery(string.Format("update {0} set {1} = {2} where {3} = {4};", Utlity.TableName, Utlity.KEY_LevelStar, newStar, Utlity.KEY_LevelID, id));
}
8、封装一个获取指定字段的值的方法
返回值为指定字段值的数据类型,参数为查询条件。
方法体内声明一个集合->接收执行一个查询语句的结果(List
public int GetStar(int id)
{
List
if (result.Count == 0) return -1;
Dictionary item = result[0];
return (int)(long)item[Utlity.KEY_LevelStar];
}
9、封装一个方法,用来查询所有信息。返回值为list<信息类>,无参。
声明一个泛型集合1,用来接收查询到的信息,并作返回使用
声明一个泛型集合2,用来接收执行一个非查询语句的结果
遍历查询到的数据所存储的集合,拿到键值对的所有数据,并把这些数据添加到泛型集合1中,作为返回值。
public List
{
// 存储所有查询结果的集合
List
// 从数据库中查询到的信息
List
foreach (Dictionary item in queryResult)
{
int id = (int)(long)item[Utlity.KEY_LevelID];
int star = (int)(long)item[Utlity.KEY_LevelStar];
// 将id和star做成一个StarInfo对象, 存到集合中
result.Add(new StarInfo(id, star));
}
return result;
}