Unity各类数据库的基本操作(六)-- SQLite

SQLite:

所有教程:点击链接


不需要配置环境
命令行--》sql语句--》操作数据库--》增删改查
安装SQLite软件:


使用:

1.创建表


2.查找表:

select ……from表名where+条件

and是且,OR是或,不区分大小写,依照个人习惯。







3.改表

update表名set键=值(改成的值)where+条件








4.删除

delete from表名where条件

drop table 表名字(删除整个表)





5.插入

insert into表名values()

插入一行(注意内容要与表头一致)


插入指定值:


6.练习题






Unity中的使用:

1.工程目录下新建文件夹:

把响应的三个类库拖到Plugins目录下:


新建SQLite文件拖到StreamingAssets文件目录下。

2.新建脚本:Data_SQLite

命名空间:

using UnityEngine;
using System.Collections;
using Mono.Data.Sqlite; 

和数据库建立链接:

//创建数据库的连接对象,通过该对象与数据库文件进行连接
	//进而打开数据库文件,用它来链接到一个数据库
	SqliteConnection con;
	//数据库文件所在的目录
	private string path;
	//定义一个数据库命令/指令,他是sql语句的载体
	SqliteCommand command;

	void Start () 
	{
		//找到要链接数据库的所在的位置
		path = "Data Source = " + Application.streamingAssetsPath + "/SQLDATA/Playter.sqlite";

		//通过路径创建出连接对象,这时con就相当于Sence视图里的数据库了
		con = new SqliteConnection(path);
		if (con != null) { 
			print ("数据库不为空");
		} else {
			print ("数据库为空");
		}

		//打开数据库
		con.Open();
		//创建数据库命令,让指令和数据除联系,数据库添加一个命令赋与command
		command = con.CreateCommand();


	}//end_Start

3.增,删,改

	void TestMethod () 
	{
		#region 第一种执行的方法,只用在增,删,改
		//注入SQL命令
				command.CommandText = 
					@"insert into PlayerData values (6,'流浪法师',3000,1200,200,0,'流浪帮','false')";
		//执行sql语句,并返回收到影响的总行数(增,删,改)
				 command.ExecuteNonQuery();

		//删除
				command.CommandText = @"delete from PlayerData where id = 6";
				int num01 = command.ExecuteNonQuery ();

		//修改
				command.CommandText = @"Update PlayerData set cd = 4.0 where address = '蜀山'";
				int num = command.ExecuteNonQuery ();
				print (num);
		#endregion
4.查找

#region 第二种执行方法,该方法只用在查询结果只有一个的时候

		//查找
		//注入SQL语句
//		command.CommandText = @"select ap,hp from PlayerData where name = '寒冰女王'";
//		command.CommandText = @"select ap,ad from PlayerData where address = '蜀山'";
		command.CommandText = @"select ad,cd from PlayerData where id = 4 OR id = 5";

		//执行sql语句,如果说查询结果有多个的话,只会返回查询结果的第一行第一列
		object o = command.ExecuteScalar();
		print(o);

		#endregion
5.读

#region 第三种执行方法,返回多个信息,或所有信息
		//注入sql语句
		command.CommandText = @"select * from PlayerData";
		SqliteDataReader reader = command.ExecuteReader();
		//如果读取了下一行,返回true,如果没有读取到下一行,说明当前是最后一行,返回false
		//reader.Read()读取下一行,返回bool类型
		while(reader.Read())
		{
			//把一行每一列读取出来,reader.FieldCount是这一行的元素个数,返回int类型
			for (int i = 0; i < reader.FieldCount; i++) {
				//打印列名+数据
				print(reader.GetName(i) +" = "+ reader.GetValue(i));
			}
		}
		#endregion


6.上述完整代码:

using UnityEngine;
using System.Collections;
using Mono.Data.Sqlite;    //引用命名空间,想要应用Sqlite的命名空间,需要在Unity里面添加插件

public class Data_SQLite : MonoBehaviour 
{
	//创建数据库的连接对象,通过该对象与数据库文件进行连接
	//进而打开数据库文件,用它来链接到一个数据库
	SqliteConnection con;
	//数据库文件所在的目录
	private string path;
	//定义一个数据库命令/指令,他是sql语句的载体
	SqliteCommand command;

	void Start () 
	{
		//找到要链接数据库的所在的位置
		path = "Data Source = " + Application.streamingAssetsPath + "/SQLDATA/Playter.sqlite";

		//通过路径创建出连接对象,这时con就相当于Sence视图里的数据库了
		con = new SqliteConnection(path);
		if (con != null) { 
			print ("数据库不为空");
		} else {
			print ("数据库为空");
		}

		//打开数据库
		con.Open();
		//创建数据库命令,让指令和数据除联系,数据库添加一个命令赋与command
		command = con.CreateCommand();

		TestMethod ();

	}//end_Start
	
	void TestMethod () 
	{
		#region 第一种执行的方法,只用在增,删,改
		//注入SQL命令
		//		command.CommandText = 
		//			@"insert into PlayerData values (6,'流浪法师',3000,1200,200,0,'流浪帮','false')";
		//执行sql语句,并返回收到影响的总行数(增,删,改)
		//		 command.ExecuteNonQuery();

		//删除
		//		command.CommandText = @"delete from PlayerData where id = 6";
		//		int num01 = command.ExecuteNonQuery ();

		//修改 
		//		command.CommandText = @"Update PlayerData set cd = 4.0 where address = '蜀山'";
		//		int num = command.ExecuteNonQuery ();
		//		print (num);
		#endregion

		#region 第二种执行方法,该方法只用在查询结果只有一个的时候

		//查找
		//注入SQL语句
//		command.CommandText = @"select ap,hp from PlayerData where name = '寒冰女王'";
//		command.CommandText = @"select ap,ad from PlayerData where address = '蜀山'";
		command.CommandText = @"select ad,cd from PlayerData where id = 4 OR id = 5";

		//执行sql语句,如果说查询结果有多个的话,只会返回查询结果的第一行第一列
		object o = command.ExecuteScalar();
		print(o);

		#endregion

		#region 第三种执行方法,返回多个信息,或所有信息
		//注入sql语句
		command.CommandText = @"select * from PlayerData";
		SqliteDataReader reader = command.ExecuteReader();
		//如果读取了下一行,返回true,如果没有读取到下一行,说明当前是最后一行,返回false
		//reader.Read()读取下一行,返回bool类型
		while(reader.Read())
		{
			//把一行每一列读取出来,reader.FieldCount是这一行的元素个数,返回int类型
			for (int i = 0; i < reader.FieldCount; i++) {
				//打印列名+数据
				print(reader.GetName(i) +" = "+ reader.GetValue(i));
			}
		}
		#endregion

	}
}

7.某位大神封装的SQLite数据库的一些列方法,项目中可以直接拿来用:

using UnityEngine;
using System.Collections;
using Mono.Data.Sqlite;
using System.Collections.Generic;

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class ShareDataBase
{

	// 单例脚本静态引用,从别的脚本里可以直接点出来使用
	public static ShareDataBase sDb = new ShareDataBase();

	// 数据库连接对象
	SqliteConnection con;

	// 数据库指令对象
	SqliteCommand command;

	// 查询结果集对象
	SqliteDataReader reader;

	// 重写构造函数, 并且连接数据库/实例化执行序列
	public ShareDataBase()
	{
		// 数据库路径  !!!!!!这里设计的不巧妙
		string dataPath = "Data Source = " + Application.streamingAssetsPath + "/test.sqlite";

		try
		{
			if (con == null)
			{
				//通过路径连接数据库,相当于con = test.sqlite
				con = new SqliteConnection(dataPath);
			}
		}
		catch (SqliteException ex)
		{
			//返回当前的异常
			Debug.Log(ex);
		}

		try
		{
			//创建可以对数据库修改的命令
			command = con.CreateCommand();
		}
		catch (SqliteException ex)
		{
			Debug.Log(ex);
		}

		//单例子本身
		sDb = this;
	}

	/// <summary>
	/// 打开数据库
	/// </summary>
	private void OpenConnectDataBase()
	{
		try
		{
			con.Open();
		}
		catch (SqliteException ex)
		{
			Debug.Log(ex);
		}
	}

	/// <summary>
	/// 关闭数据库
	/// </summary>
	private void CloseConnectionDataBase()
	{
		try
		{
			con.Close();
		}
		catch (SqliteException ex)
		{
			Debug.Log(ex);
		}
	}

	/// <summary>
	/// 增删改的操作方法
	/// </summary>
	/// <param name="query">查寻语句</param>
	public void ExecSql(string query)
	{
		OpenConnectDataBase();

		try
		{
			command.CommandText = query;
			command.ExecuteNonQuery();
		}
		catch (SqliteException ex)
		{
			Debug.Log(ex);
		}

		CloseConnectionDataBase();
	}

	/// <summary>
	/// 返回第一个单元格(可以用来数条数)
	/// </summary>
	/// <returns>The filed sql.</returns>
	/// <param name="query">查询语句</param>
	public object SelectFiledSql(string query)
	{
		OpenConnectDataBase();

		object obj = new object();

		try
		{
			command.CommandText = query;
			obj = command.ExecuteScalar();
		}
		catch (SqliteException ex)
		{
			Debug.Log(ex);
		}

		CloseConnectionDataBase();

		return obj;
	}

	/// <summary>
	/// 返回全部结果集, 需要外部继续解析.
	/// </summary>
	/// <returns>全部结果</returns>
	/// <param name="query">查询语句</param>
	public List<ArrayList> SelectResultSql(string query)
	{
		OpenConnectDataBase();
		//泛型里面的元素是键值对数组,一个人是一个泛型元素,任务里面的信息(id,name,hp)
		List<ArrayList> l = new List<ArrayList>();
		ArrayList temp = new ArrayList();

		try
		{
			command.CommandText = query;
			reader = command.ExecuteReader();
			while (reader.Read())
			{
				temp.Clear();
				for (int i = 0; i < reader.FieldCount; i++)
				{
					temp.Add(reader.GetValue(i));
				}
				l.Add(temp);
			}
			reader.Close();
		}
		catch (SqliteException ex)
		{
			Debug.Log(ex);
		}
		CloseConnectionDataBase();

		return l;
	}

	/// <summary>
	/// 将一个object对象序列化,返回一个byte[]
	/// </summary>
	/// <returns>The to bytes.</returns>
	/// <param name="obj">Object.</param>
	public byte[] ObjectToBytes(object obj)
	{
		//using语句,释放内存,MemoryStream内存流,不使用using就是用ms.dispose();释放内存
		using (MemoryStream ms = new MemoryStream())
		{
			IFormatter formatter = new BinaryFormatter();
			formatter.Serialize(ms, obj);
			return ms.GetBuffer();
		}

	}

	/// <summary>
	/// 将一个序列化后的byte[]数组还原        
	/// </summary>
	/// <returns>The to object.</returns>
	/// <param name="Bytes">Bytes.</param>
	public object BytesToObject(byte[] Bytes)
	{
		using (MemoryStream ms = new MemoryStream(Bytes))
		{
			IFormatter formatter = new BinaryFormatter();
			return formatter.Deserialize(ms);
		}
	}

	/// <summary>
	/// 二进制数据绑定参数
	/// </summary>
	/// <param name="name">Name.</param>
	/// <param name="age">Age.</param>
	/// <param name="l">L.</param>
	public void InsertData(string name, int age, byte[] l)
	{
		
		OpenConnectDataBase();
		string sql = "INSERT INTO tmp1(name, age, info) values (@name, @age, @info)";

		SqliteParameter[] parameters = new SqliteParameter[] {
			   new SqliteParameter ("@name", name),
			   new SqliteParameter ("@age", age.ToString ()),
			   new SqliteParameter ("@info", l)
		  };

		command.Parameters.AddRange(parameters);
		command.CommandText = sql;
		command.ExecuteNonQuery();

		CloseConnectionDataBase();
	}
}




Android打包发布问题:




1.发不到Android段需啊哟添加libsqlite3.so文件,和相应的Mono.Data.Sqlite.dll、sqlite3.dll、System.Data.dll类库

注意:所有文件放到Plugins文件夹下,libsqlite3.so方法Android文件夹下:


2.安卓发布的特殊性在于连接本地Sqlite数据库的时候,如果没有找到数据库文件,无法创建空的数据库。

解决方案有两种:

(1)加载libsqlit.so之后,安卓会恢复自创建数据库的功能。在编写代码时,可以通过判断是否有数据库文件来判断是否存在数据库文件,

从而通过重新建表重新插入数据实现。但这种方案对于数据库内容较多的项目来说,增添了太多的代码量,所以一般不是用这种方案,除非是表格内容较少时。

(2)同样需啊哟上述的三个类库和libsqlite.so文件,但不需要重新建表插入数据内容,当安卓端安装应用程序时,需要一个*.apk的安装文件,此文件保存着我们从Unity开发平台导入的*.sqlite文件,所以我嗯可以通过www来下载该sqlite文件,从而通过I/O流写入到安卓本地沙盒路径里(persistentDataPath),该文件保存着所有表格和数据,无需再次创建和插入,通常使用的都是这种方法,较为便捷。

3.具体写法:




  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值