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.具体写法: