连接sqlite数据库操作C#版

最近几天在讨论游戏本地数据存储方式,考虑到跨平台性。最开始打算用xml,但是考虑到xml文件多而杂,而且后期游戏更新。也不是很方便,于是提出了采用sqlite,可是没想到的是原本信心满满的我却遭到了闭门羹,呵呵....

原来,不是用 以前做c#  winform应用那套dll, unity 3d有自己对应的sqlite.dll分别需要三个文件
1.Mono.Data.Sqlite.dll 
在unity安装文件“\Editor\Data\MonoBleedingEdge\lib\mono”可以找到,注意mono文件夹下面 有对应版本号,可以根据自己的项目来决定选择。

2.System.Data.dll   同上位置一样可以找到 ,不过建议使用2.0版本

3.sqlite3.dll   就在\Unity\Editor下可以找到

除此之外,还需要把这3个文件放在你的项目的这个路径下面:\Assets\Plugins\,没有Plugins文件夹就必须创建这个文件夹,然后将这三个dll文件放在该文件夹下面。当然,如果你想能够在PC上面发布成可执行文件,还需要改动一些地方。在unity3d中的Play Setting ->Other Setting 中将Api Compatibility的等级改为.NET 2.0;那么这些操作做完了以后,如果你的代码写得没有 问题 ,那么你就可以成功了。

好啦 ,前面准工作完成 下面就直接看测试代码吧
首先是一个 Sqlite的数据库操作类,该类是我改编的 网上也有很多,不过好像是js编写,于是自己动手改编成了c#希望能对大家有用,呵呵...

好了,上类  SqliteDbHelper
  1. using UnityEngine;
  2. using System.Collections;
  3. //导入sqlite数据集,也就是Plugins文件夹下的那个dll文件
  4. using Mono.Data.Sqlite;
  5. using System;
  6. //数据集 是formwork2.0 用vs开发要自己引用框架中的System.Data
  7. using System.Data;
  8. public class SqliteDbHelper
  9. {
  10.     ///
  11.     /// 声明一个连接对象
  12.     ///
  13.     private SqliteConnection dbConnection;
  14.     ///
  15.     /// 声明一个操作数据库命令
  16.     ///
  17.     private SqliteCommand dbCommand;
  18.     ///
  19.     /// 声明一个读取结果集的一个或多个结果流
  20.     ///
  21.     private SqliteDataReader reader;
  22.     ///
  23.     /// 数据库的连接字符串,用于建立与特定数据源的连接
  24.     ///
  25.     /// 数据库的连接字符串,用于建立与特定数据源的连接
  26.     public SqliteDbHelper (string connectionString)
  27.     {
  28.      OpenDB (connectionString);
  29.         Debug.Log(connectionString);
  30.     }
  31.     public void OpenDB (string connectionString)
  32.     {
  33.       try
  34.       {
  35.        dbConnection = new SqliteConnection (connectionString);
  36.        dbConnection.Open();
  37.        Debug.Log ("Connected to db");
  38.       }
  39.       catch(Exception e)
  40.       {
  41.        string temp1 = e.ToString();
  42.        Debug.Log(temp1);
  43.       }
  44.     }
  45.     ///
  46.     /// 关闭连接
  47.     ///
  48.     public void CloseSqlConnection ()
  49.     {
  50.       if (dbCommand != null)
  51.       {
  52.                 dbCommand.Dispose();
  53.       }
  54.       dbCommand = null;
  55.       if (reader != null)
  56.       {
  57.        reader.Dispose ();
  58.       }
  59.       reader = null;
  60.       if (dbConnection != null)
  61.       {
  62.        dbConnection.Close ();
  63.       }
  64.       dbConnection = null;
  65.       Debug.Log ("Disconnected from db.");
  66.     }
  67.     ///
  68.     /// 执行查询sqlite语句操作
  69.     ///
  70.     ///
  71.     ///
  72.     public SqliteDataReader ExecuteQuery (string sqlQuery)
  73.     {
  74.      dbCommand = dbConnection.CreateCommand ();
  75.      dbCommand.CommandText = sqlQuery;
  76.      reader = dbCommand.ExecuteReader ();
  77.      return reader;
  78.     }
  79.     ///
  80.     /// 查询该表所有数据
  81.     ///
  82.     /// 表名
  83.     ///
  84.     public SqliteDataReader ReadFullTable (string tableName)
  85.     {
  86.      string query = "SELECT * FROM " + tableName;
  87.      return ExecuteQuery (query);
  88.     }
  89.     ///
  90.     /// 动态添加表字段到指定表
  91.     ///
  92.     /// 表名
  93.     /// 字段集合
  94.     ///
  95.     public SqliteDataReader InsertInto (string tableName, string[] values)
  96.     {
  97.      string query = "INSERT INTO " + tableName + " VALUES (" + values[0];
  98.      for (int i = 1; i < values.Length; ++i)
  99.      {
  100.       query += ", " + values;
  101.      }
  102.      query += ")";
  103.      return ExecuteQuery (query);
  104.     }
  105.     ///
  106.     /// 动态更新表结构
  107.     ///
  108.     /// 表名
  109.     /// 字段集
  110.     /// 对于集合值
  111.     /// 要查询的字段
  112.     /// 要查询的字段值
  113.     ///
  114.     public SqliteDataReader UpdateInto (string tableName, string []cols,
  115.       string []colsvalues,string selectkey,string selectvalue)
  116.     {
  117.          string query = "UPDATE "+tableName+" SET "+cols[0]+" = "+colsvalues[0];
  118.          for (int i = 1; i < colsvalues.Length; ++i) {
  119.               query += ", " +cols+" ="+ colsvalues;
  120.          }
  121.           query += " WHERE "+selectkey+" = "+selectvalue+" ";
  122.          return ExecuteQuery (query);
  123.     }
  124.     ///
  125.     /// 动态删除指定表字段数据
  126.     ///
  127.     /// 表名
  128.     /// 字段
  129.     /// 字段值
  130.     ///
  131.     public SqliteDataReader Delete(string tableName,string []cols,string []colsvalues)
  132.     {
  133.      string query = "DELETE FROM "+tableName + " WHERE " +cols[0] +" = " + colsvalues[0];
  134.      for (int i = 1; i < colsvalues.Length; ++i)
  135.         {
  136.               query += " or " +cols+" = "+ colsvalues;
  137.      }
  138.          Debug.Log(query);
  139.          return ExecuteQuery (query);
  140.     }
  141.     ///
  142.     /// 动态添加数据到指定表
  143.     ///
  144.     /// 表名
  145.     /// 字段
  146.     ///
  147.     ///
  148.      public SqliteDataReader InsertIntoSpecific (string tableName, string[] cols,
  149.       string[] values)
  150.      {
  151.          if (cols.Length != values.Length)
  152.          {
  153.              throw new SqliteException ("columns.Length != values.Length");
  154.          }
  155.          string query = "INSERT INTO " + tableName + "(" + cols[0];
  156.          for (int i = 1; i < cols.Length; ++i)
  157.          {
  158.              query += ", " + cols;
  159.          }
  160.          query += ") VALUES (" + values[0];
  161.          for (int i = 1; i < values.Length; ++i)
  162.          {
  163.              query += ", " + values;
  164.          }
  165.          query += ")";
  166.          return ExecuteQuery (query);
  167.      }
  168.     ///
  169.     /// 动态删除表
  170.     ///
  171.     /// 表名
  172.     ///
  173.      public SqliteDataReader DeleteContents (string tableName)
  174.      {
  175.          string query = "DELETE FROM " + tableName;
  176.          return ExecuteQuery (query);
  177.      }
  178.     ///
  179.     /// 动态创建表
  180.     ///
  181.     /// 表名
  182.     /// 字段
  183.     /// 类型
  184.     ///
  185.      public SqliteDataReader CreateTable (string name, string[] col, string[] colType)
  186.      {
  187.          if (col.Length != colType.Length)
  188.          {
  189.              throw new SqliteException ("columns.Length != colType.Length");
  190.          }
  191.          string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0];
  192.          for (int i = 1; i < col.Length; ++i)
  193.          {
  194.              query += ", " + col + " " + colType;
  195.          }
  196.          query += ")";
  197.          Debug.Log(query);
  198.          return ExecuteQuery (query);
  199.      }
  200.     ///
  201.     /// 根据查询条件 动态查询数据信息
  202.     ///
  203.     ///
  204.     /// 查询数据集合
  205.     /// 字段
  206.     /// 操作
  207.     ///
  208.     ///
  209.      public SqliteDataReader SelectWhere (string tableName, string[] items, string[] col, string[] operation, string[] values)
  210.      {
  211.          if (col.Length != operation.Length || operation.Length != values.Length)
  212.          {
  213.              throw new SqliteException ("col.Length != operation.Length != values.Length");
  214.          }
  215.          string query = "SELECT " + items[0];
  216.          for (int i = 1; i < items.Length; ++i)
  217.          {
  218.        query += ", " + items;
  219.          }
  220.           query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' ";
  221.          for (int i = 1; i < col.Length; ++i)
  222.          {
  223.              query += " AND " + col + operation + "'" + values[0] + "' ";
  224.          }
  225.          return ExecuteQuery (query);
  226.      }
  227. }
复制代码
好了 sqlite数据操作类写好后:本来应该按照编码规范来写  因为我本身以前做c#的所有一般使用三层架构
Modle实例化对象类 ,DAl数据处理类,IDal数据接口类,Bll业务逻辑类
但是呢,目前只为测试 因此我就不一一详细介绍代码内容了,相信会c#的人都会三层架构,呵呵

ok,言归正传,下面将贴出unity3d 使用上面 sqliteDbHelper 操作类
SqliteDbTest:
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using Mono.Data.Sqlite;
  5. using System.Data;
  6. public class SqliteDbTest : MonoBehaviour {

  7. SqliteDbHelper db ;
  8. int id=1;
  9. void Start ()
  10. {
  11.         db = new SqliteDbHelper("Data Source=./sqlite.db");
  12.         Debug.Log(db.ToString());
  13.    /*
  14.     SqliteDbAccess db = new SqliteDbAccess("data source=mydb1.db");
  15.   db.CreateTable("momo",new string[]{"name","qq","email","blog"},
  16.    new string[]{"text","text","text","text"});
  17.   db.CloseSqlConnection();
  18.    */
  19.   }    public  string name = "";
  20.         public string emls = "";
  21. void OnGUI()
  22. {

  23.   if(GUILayout.Button("create table"))
  24.   {
  25.    db.CreateTable("mytable",new string[]{"id","name","email"},new string[]{"int","varchar(20)","varchar(50)"});
  26.    Debug.Log("create table ok");
  27.   }

  28.   if(GUILayout.Button("insert data"))
  29.   {

  30.    db.InsertInto("mytable",
  31.                 new string[] { "" + (++id), "'随风去旅行"+id+"'","'zhangj_live"+id+"@163.com'"});//),"'aaa"+id+"'","'aaa"+id+"@sohu.com'"});

  32.    Debug.Log("insert table ok");
  33.   }


  34.   if(GUILayout.Button("search database"))
  35.         {
  36.             IDataReader sqReader = db.SelectWhere("mytable", new string[]
  37.     {"name","email"},new string[]{"id"},new string[]{"="},new string[]{"2"});
  38.    while (sqReader.Read())
  39.    {

  40.      //Debug.Log(
  41.      name= "name="+sqReader.GetString(sqReader.GetOrdinal("name"));// +
  42.                  emls = "email=" + sqReader.GetString(sqReader.GetOrdinal("email"));
  43.      //);
  44.    }

  45.   }
  46.         if (name != "")
  47.         {
  48.             GUI.Label(new Rect(100, 100, 100, 100), name);
  49.             GUI.Label(new Rect(100, 200, 100, 100), emls);
  50.             //  GUILayout.Label(emls);
  51.         }
  52.   if(GUILayout.Button("close database"))
  53.   {
  54.    db.CloseSqlConnection();
  55.    Debug.Log("close table ok");
  56.   }

  57. }

  58. }
复制代码
上面的代码很简单 ,相信稍微懂点unity3d的,都能看懂 因此就小偷懒一般 没写注释了,呵呵

运行结果:

连接sqlite数据库操作C#版_第1张图片 

由此可以看出 分别实现了
1.动态创建数据库及表结构
2.动态创加入数据
3,.查询指定字段
4.关闭数据连接

好了,为了更好的证实我们去创建的数据库看看

sqlite.db就是我们动态创建的数据库

连接sqlite数据库操作C#版_第2张图片 

用工具打开数据库 ,可以看到我们建好的表“mytable”及字段

连接sqlite数据库操作C#版_第3张图片 

切换选项,在数据选项中可以清楚看到我们动态插入的记录


连接sqlite数据库操作C#版_第4张图片 

好了,该文先总结于此 

你可能感兴趣的:(C#,数据库)