您的位置:首页 > 数据库

关于SqLite的研究

2015-11-23 22:12 489 查看
  做移动开发的时候,很多情况会用到数据库,大型的数据库也不能用,而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();
}

创建表
[align=left]
[/align]
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 () {

}
}


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


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

定义一个路径下的数据库我们这么写

[align=left]  //创建数据库对象[/align]
[align=left]        connection =newSqliteConnection(con);[/align]
[align=left]       //打开数据库[/align]
[align=left]        connection.Open();[/align]
我们读取数据的时候
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。这个需要注意的。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sqlite unity c#