关于SqLite的研究

来源:互联网 发布:嘉兴学院雅尔网络课程 编辑:程序博客网 时间:2024/05/29 11:41

  做移动开发的时候,很多情况会用到数据库,大型的数据库也不能用,而sqlite则是以小巧著称。非常适合移动端的使用,当然要是联网在线的直接连接到服务器上又另当别算了。

那么,具体怎么使用呢?

引入三个文件(这里可以打包下次重复使用)

unity3d有自己对应的sqlite.dll分别需要三个文件
1.Mono.Data.Sqlite.dll 
在unity安装文件“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;那么这些操作做完了以后,如果你的代码写得没有问题,那么你就可以成功了。

代码操作

首先引入
   using Mono.Data.Sqlite;
创建数据库
  private void CreateDB() {        string connectionString = " Data Source = " + Application.dataPath + "/afterDB.sqlite" ;             dbConnection = new SqliteConnection (connectionString);        dbConnection.Open();     }

创建表

private void CreateTable()    {        //创建数据指令对象        SqliteCommand command = new SqliteCommand(dbConnection);        //给指令添加sql语句 :如果不存在person,创建; if exists是如果存在        command.CommandText = "create table if not exists afterDB(name text,x float,y float,z float)";        //执行sql 语句        command.ExecuteNonQuery();    }

这样就可进行增删改查的操作了。

这里用一个例子说明使用:

using UnityEngine;using System.Collections;using Mono.Data.Sqlite;public class dbaccess  {    public dbaccess(string dbName) {//构造方法        OpenDB(dbName);    }    //开启和关闭数据库时用    private SqliteConnection dbConnection;    //执行命令语句时调用    private SqliteCommand dbCommand;    //执行命令语句都会返回一个SqlitDataReader    private SqliteDataReader reader;    //开启    public void OpenDB( string DBName) {        //捕获异常        try        {            dbConnection = new SqliteConnection(DBName);            dbConnection.Open();            Debug.Log("db is open");        }        catch (UnityException ex)        {            Debug.Log(ex.ToString());        }    }    //关闭    public void CloseDb() {        if (reader!=null)        {            //释放            reader.Dispose();        }        reader = null;        if (dbCommand != null)        {            //释放            dbCommand.Dispose();        }        dbCommand = null;        if (dbConnection != null)        {            //释放            dbConnection.Close();        }        dbConnection = null;        Debug.Log("db is close");    }    //执行命令语句的方法    public SqliteDataReader ExcuteSQL(string sqlstr) {        dbCommand = dbConnection.CreateCommand();        dbCommand.CommandText = sqlstr;        reader = dbCommand.ExecuteReader();        return reader;    }    //创建表    public SqliteDataReader CreateTable(string tableName,string[] colNames,string[] colTypes) {        if (colNames.Length!=colTypes.Length)        {            throw new SqliteException("colNames.Length!=colTypes.Length");        }        string createTable = "create table " + tableName + "(" + colNames[0] + " " + colTypes[0];        for (int i = 1; i < colNames.Length; i++)        {            createTable += "," + colNames[i] + " " + colTypes[i];        }        createTable += ")";        return ExcuteSQL(createTable);    }    //增    public SqliteDataReader IsertInto(string tableName,string[] values)     {        string insertInto = "insert into " + tableName + " values (" + values[0];        for (int i = 1; i < values.Length; i++)        {            insertInto += "," + values[i];        }        insertInto += ")";        return ExcuteSQL(insertInto);    }    //删    public SqliteDataReader Delete(string tableName,string[] colNames,string[] colValues)    {        string delete = "delete from " + tableName + " where " + colNames[0] + "=" + colValues[0];        for (int i = 1; i < colNames.Length; i++)        {            delete += " or " + colNames[i] + "=" + colValues[i];        }        Debug.Log(delete);        return ExcuteSQL(delete);    }    //改    public SqliteDataReader Update(string tableName, string[] names, string[] values, string name, string value)     {        string updateTable = "update " + tableName + "  set " + names[0] + "=" + values[0];        for (int i = 1; i < names.Length; i++)        {            updateTable += "," + names[i] + "=" + values[i];        }        updateTable += " where " + name + "=" + value;        return ExcuteSQL(updateTable);    }    //查    public SqliteDataReader SelectTable(string tableName) {        string selectTable = "select * from " + tableName;        return ExcuteSQL(selectTable);    }}
在写一个调用这个脚本的脚本,挂在一个对象上;
using UnityEngine;using System.Collections;using Mono.Data.Sqlite;public class DBtest : MonoBehaviour {void Start () {        dbaccess db = new dbaccess("data source=ghh.sqlite");        //db.CreateTable("lc",new string[]{"name","sex","age"},new string[]{"text","text","integer"});        //db.IsertInto("lc", new string[] { "'liuchao'", "'lan'", "23" });        //db.IsertInto("lc", new string[] { "'liuchao'", "'lv'", "21" });        //db.IsertInto("lc", new string[] { "'刘刚'", "'男'", "18" });        //db.Delete("lc", new string[] { "name", "sex"}, new string[] { "'liuchao'", "'lv'" });        //db.Update("lc", new string[] { "sex", "age" }, new string[] { "'lan'", "1213" },"name","liuchao");        SqliteDataReader select = db.SelectTable("lc");        while (select.Read())        {            string name = select.GetString(select.GetOrdinal("name"));            Debug.Log(name);           string sex = select.GetString(select.GetOrdinal("sex"));            Debug.Log(sex);            int age = select.GetInt32(select.GetOrdinal("age"));           Debug.Log(age);        }     }void Update () {}}

这样就完成了对数据库的各种操作了。。

这个从数据库读取数据需要注意一下

定义一个路径下的数据库我们这么写
  //创建数据库对象
        connection =newSqliteConnection(con);
       //打开数据库
        connection.Open();
我们读取数据的时候
private void SelectObject() {        SqliteCommand command = new SqliteCommand(connection);        command.CommandText = "select *from person where name=' 小明'";        //第一行第一列        object ob = command.ExecuteScalar();// 主要是这个查询        print(ob);        //读取数据        SqliteDataReader reader = command.ExecuteReader();        //每read 一下读一下        while (reader.Read()) {            print(reader[ "name"]);            print(reader[ "num"]);            print(reader[ "age"]);        }

命令对象command调用的ExcuteScalar查询,而且还调用了ExecuteReader。这个需要注意的。。

0 0