数据库框架

数据库框架
数据库共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、连接到指定数据库,并打开
/// <summary>
/// 连接到指定数据库,并打开它.
/// </summary>
/// <param name="databasename">数据库名称.</param>
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<Dictionary<string,object>>,此返回值为数据库中要存储的数据类型,参数为string(SQL语句)的方法
在方法内先声明一个返回值类型的集合,用来存储执行SQL语句查询到的结果,用while()循环遍历表中的数据,查询到的每一条数据以键值对的形式存储起来
用SqliteDataReader.FieldCount属性拿到当前这一行数据的列数,用for循环遍历读到这一行的所有列,并将所有数据添加到键值对集合中。
而后再把这个键值对集合添加到外层集合(返回值的外层集合)
在while循环外关闭SqliteDataReader对象
由于以上操作可能出现异常,所以用try{}catch(){}捕获一下异常。
把添加好的list<Dictionary<string,object>>集合返回即可
public List<Dictionary<string, object>> ExecuteQuery(string sql)
{
// 存储所有查询结果的集合, 查询到的每一条数据以键值对的形式存在
List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();

    command.CommandText = sql;

    try
    {
        reader = command.ExecuteReader();

        while (reader.Read())
        {
            // 说明读到了一行数据, 将这一行数据做成键值对
            Dictionary<string, object> item = new Dictionary<string, object>();
            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<Dictionary<string, object>>,此为第一个工具类定义的执行一个非查询语句的返回值类型),而后做一个判断,如果结果(结果为键值对)的Count==0,也就是说没有查询到想要的数据,我们返回-1,表示没有查询到。如果查询到了,我们把这个值拿出来(查询数据的条件理应保持唯一性)。
public int GetStar(int id)
{
List<Dictionary<string, object>> result = ExecuteQuery(string.Format("select {0} from {1} where {2} = {3}", Utlity.KEY_LevelStar, Utlity.TableName, Utlity.KEY_LevelID, id));
if (result.Count == 0) return -1;

    Dictionary<string, object> item = result[0];
    return (int)(long)item[Utlity.KEY_LevelStar];
}

9、封装一个方法,用来查询所有信息。返回值为list<信息类>,无参。
声明一个泛型集合1,用来接收查询到的信息,并作返回使用
声明一个泛型集合2,用来接收执行一个非查询语句的结果
遍历查询到的数据所存储的集合,拿到键值对的所有数据,并把这些数据添加到泛型集合1中,作为返回值。
public List<StarInfo> QueryAll()
{
// 存储所有查询结果的集合
List<StarInfo> result = new List<StarInfo>();
// 从数据库中查询到的信息
List<Dictionary<string, object>> queryResult = ExecuteQuery(string.Format("select * from {0}", Utlity.TableName));

    foreach (Dictionary<string, object> 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;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容