Unity各类数据库的基本操作(六)-- SQLite
来源:互联网 发布:淘宝刷一个钻多少钱 编辑:程序博客网 时间:2024/05/29 19:10
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);#endregion5.读
#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.具体写法:
- Unity各类数据库的基本操作(六)-- SQLite
- Unity各类基础数据库的基本操作(一)
- Unity各类数据库的基本操作(二)-- CSV
- Unity各类数据库的基本操作(三)-- JSON
- Unity各类数据库的基本操作(四)-- XML
- Unity各类数据库的基本操作(五)-- PlayerPrefs
- SQLite数据库的基本操作
- SQLite数据库的基本操作
- sqlite数据库的基本操作
- Unity Sqlite数据库操作
- unity sqlite数据库操作
- SQLite数据库---数据库的基本操作
- sqlite数据库基本操作
- SQLite数据库基本操作
- sqlite数据库基本操作
- SQLite数据库基本操作
- 数据库sqlite基本操作
- SQLite数据库基本操作
- ListView多条目加载
- 关系型数据库到MongoDB的战略迁移
- oracle创建job
- 通过onWindowAttributesChanged和onSystemUiVisibilityChange监听状态栏页面的隐藏与显示、动态显示与隐藏状态栏
- Android 代码风格规范
- Unity各类数据库的基本操作(六)-- SQLite
- SpringMVC学习笔记(一)
- java常见问题总结
- 解决Win8系统电脑突然突然没有声音了
- FNBJ-8“dchanged”未定义
- confluence页面加目录索引
- [程序员面试金典-查找]矩阵元素查找
- poj1658——Eva's Problem
- 最简洁的方式改变状态栏背景色