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

来源:互联网 发布:淘宝刷一个钻多少钱 编辑:程序博客网 时间:2024/05/29 19:10

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();//创建数据库命令,让指令和数据除联系,数据库添加一个命令赋与commandcommand = 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();//创建数据库命令,让指令和数据除联系,数据库添加一个命令赋与commandcommand = con.CreateCommand();TestMethod ();}//end_Startvoid 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.sqlitecon = 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 0
原创粉丝点击