Unity中Sqlite数据库
++1.1、什么是SQLite
++++1、SQLite是一款轻型的数据库。
++++2、SQLite的设计目标是嵌入式的。
++++3、SQLite占用资源非常的低。
++++4、SQLite能够支持Windows/Linux/Unix等等主流的操作系统。
++1.2、SQLite安装
++++下载地址:
--http://rj.baidu.com/soft/detail/22353.html?ald
--SQLiteManager
++1.3、创建数据库
++++【New SQLite Database】
++1.4、创建数据库表格
++1.5、数据预览与操作
++1.6、执行SQL语句
++2.1、SQL INSERT INTO语句
++++作用: INSERT INTO 语句用于向表格中插入新的行。
++++语法1:INSERT INTO 表名称VALUES(值1,值2,...)
++++语法2:INSERT INTO table_name(列1,列2,...) VALUES(值1,值2,...)
++++示例1:
--INSERT INTO Persons VALUES(‘Gates’, ‘Bill’, ‘Xuanwumen 10’, ‘Beijing’)
++++示例2:
--INSERT INTO Persons(LastName, Address) VALUES(‘Wilson’, ‘Champs-Elysees’)
++2.2、SQL DELETE语句
++++作用: DELETE语句用于删除表中的行。
++++语法: DELETE FROM Person WHERE LastName =‘Wilson’
++++示例1:
--DELETE FROM Person WHERE LastName = ‘Wilson’
++++示例2:
--DELETE FROM table_name(删除表格所有内容)
++2.3、SQL UPDATE语句
++++作用: Update语句用于修改表中的数据。
++++语法: UPDATE 表名称 SET 列名称=新值 WHERE 列名称=某值
++++示例:
--UPDATE Person SET FirstName = ‘Fred’ WHERE LastName=’Wilson’
++2.4、SQL SELECT语句
++++作用: SELECT语句用于从表中选取数据。
++++语法: SELECT 列名称 FROM 表名称
++++示例:
--SELECT LastName,FirstName FROM Persons
++4.1、准备工作
++++导入mono.data.sqlite.dll到Assets文件夹
++++代码添加库: using Mono.Data.Sqlite;
++4.2、SQLiteConnection
++++使用SQLiteConnection对象,进行数据库连接,此操作可以创建空的数据库。
++++数据连接:
//数据库连接路径
string path = “data source=” + Application.streamingAssetsPath + “/UserDatabase.sqlite”;
void OpenDataBase(string connectionString){
try{
conn = new SqliteConnection(connectionString);
conn.Open();
}catch(System.Exception exc){
Debug.Log(exc);
}
}
++4.3、SQLiteCommand
++++使用SqliteCommand数据指令对象进行数据库操作。
++++使用SqliteDataReader数据读取对象,进行数据库内容读取。
++++建表:
//建表
void CreateTable(){
//判断数据库中是否有UserTable这个表
SqliteCommand cmd = conn.CreateCommand();
cmd.CommandText = “select count(*) from sqlite_master where type=’table’ and name=’UserTable’”;
SqliteDataReader reader = cmd.ExecuteReader();
//判断数据库中是否存在这张表
bool isExsit = false;
while(reader.Read()){
for(inti= 0; i<reader.FieldCount; i++){
if(reader.GetValue(i).ToString() == “1”){
isExsit=true;
}
}
}
//如果表不存在则建表
reader.Dispose();
reader.Close();
reader= null;
if(!isExist){
Debug.Log(“表不存在,建表”);
cmd.CommandText= “Create Table UserTable(uname text, pwd text)”;
cmd.ExecuteNonQuery();
}
cmd.Dispose();
cmd= null
CloseDataBase(); //数据库操作完成之后要将数据库关闭
}
++++插入数据:
//向UserTable表中插入数据
SqliteCommand cmd = conn.CreateCommand();
cmd.CommandText = “insert into UserTable values(‘ “+unameInput.text+“ ’,‘ “+passwordInput.text+” ’)”;
try{
cmd.ExecuteNonQuery()
}catch(System.Exception exc){
Debug.Log(exc);
}
++++4.4、SQLiteDataReader
++++使用SqliteDataReader数据读取对象,进行数据库内容读取。
//创建查询的sql语句
string query = “select pwd from UserTable where uname=”+” ‘ “+uname+” ’ ”;
SqliteCommand cmd = conn.CreateCommand();
cmd.CommandText = query;
SqliteDataReader reader = cmd.ExecuteReader(); //执行查询操作
bool result = false; //标记表中是否有此条数据
while(reader.Read()){
for(int i =0; i<reader.FieldCount; i++){
if(reader.GetValue(i).ToString() == pwd){
//reader.GetValue(i)返回表中某一列所对应的值
result = true; //如果有,就修改标记值
}
}
}
++执行SQL语句三种方式
++++1、int ExecuteNonQuery()
--返回受影响的行数(常用于执行增删改操作)
++++2、object ExecuteScalar()
--返回查询到的第一个值(常用于只查询一个结果时)
++++3、SqliteDataReader ExecuteReader()
--返回所有查询的结果(SqliteDataReader对象)
++5.1、为何要封装?
++++1、方便项目管理
++++2、方便开发人员的快捷的使用
++++3、防止高度保密数据外泄
++5.2、要封装哪些方法?
++++1、连接数据库
++++2、通过Sql语句查询数据
++++3、通过表名查询全表数据
...
++++4、关闭数据库连接,释放资源
++5.3、连接数据库
public class DataBase{
SqliteConnection conn; //数据库链接对象
public DataBase(string connectionPath){
ConnectionDB(connectionPath);
}
//连接数据库
void ConnectionDB(string connectionPath){
try{
conn = new SpliteConnection(connectionPath);
Debug.Log(“连接数据库”);
}catch(System.Exception exp){
Debug.Log(exp);
throw;
}
}
DataBase _db; //Use this for initialization
void Start(){
string path=null;
#if UNITY_IPHONE
path = “data source=” + Application.persistentDataPath + “/UserData.db”;
#elif UNITY_STANDALONE_WIN
path = “data source=” + Application.streamingAssetsPath + “/UserData.db”;
#elif UNITY_ANDROID
path = “url=file:” + Application.persistentDataPath + “/UserData.db”;
#endif
_db = new DataBase(path);
}
}
++5.4、通过Sql语句插入数据
//向某个表中插入数据
public void InsertDatabase(string tableName, string[] row){
OpenDataBase(); //打开数据库
string sql=“insert into” + tableName +“values(” + row[0];
for(int i =1; i < row.Length; i++){
sql += ‘’,” + row[i];
}
sql += “)”;
cmd =conn.CreateCommand();
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
CloseDataBase(); //关闭数据库
}
++5.5、通过Sql语句查询
//通过Sql语句查询,返回查询结果
public SqliteDataReader SelectFromDataBase(string sql){
try{
cmd = conn.CreateCommand();
cmd.CommandText = sql;
reader = cmd.ExecuteReader();
return reader;
}catch(System.Exception exp){
Debug.Log(exp);
return null;
}
}
++5.6、通过表名查询所有数据
//通过表名查询所有数据
public SqliteDataReader SelectFullFromDataBase(string tableName){
OpenDataBase();
try{
string sql = “select * from” + tableName;
cmd.CommandText = sql;
reader = cmd.ExecuteReader();
return reader;
}catch(System.Exception exp){
Debug.Log(exp);
return null;
}
}
++6.1、平台-路径(数据库存储路径)
---编辑器
---PC/iOS
---Android
++++编辑器:
--本地路径:
---存储路径: Application.dataPath
---语法:connectionStr = “Data Source=” + Application.dataPath + “/” + databaseName;
--流路径:
---存储路径: Application.streamingAssetsPath
---语法: connectionStr = “Data Source=” + Application.streamingAssetsPath + “/” + databaseName;
--沙盒路径:
---存储路径: Application.persistentDataPath
---语法: connectionStr = “Data Source=” + Application.persistentDataPath + “/” + databaseName;
++++PC/iOS
--流路径:
---存储路径: Application.streamingAssetsPath
---语法: connectionStr = “Data Source” + Application.streamingAssetsPath + “/” + databaseName;
--沙盒路径:
---存储路径: Application.persistentDataPath
---语法: connectionStr = “Data Source=” + Application.persistentDataPath + “/” + databaseName;
++++Android
--沙盒路径:
---存储路径: Application.persistentDataPath
---语法: connectionStr = “URl=file:” + Application.persistentDataPath + “/” + databaseName;
++6.2、Application.dataPath
++++在直接使用Application.dataPath来读取文件进行操作,移动端是没有访问权限的。
++6.3、Application.streamingAssetsPath
++++直接使用Application.streamingAssetsPath来读取文件进行操作,此方法在pc/Mac电脑中可实现对文件实施“增删查改”等操作,但在移动端只支持读取操作。
++6.4、Application.persistentDataPath
++++使用Application.persistentDataPath来操作文件,该文件存在手机沙盒中,因为不能直接存放文件。
--1、通过服务器直接下载保存到该位置,也可以通过Md5码对比下载更新新的资源。
--2、没有服务器的,只有间接通过文件流的方式从本地读取并写入Application.persistentDataPath文件下,然后再通过Application.persistentDataPath来读取操作。
++++注:在Pc/Mac电脑以及Android跟Ipad、iphone都可对文件进行任意操作,另外在IOS上该目录下的东西可以被iCloud自动备份。
++7.1、发布到PC端
++++1、Mac端数据库文件会封装到MacApp中。
++++2、Windows端数据库文件会放到伴随文件夹Project_Name_Data中
++7.2、发布到Android端
++++发布到Android端需要添加libsqlite3.so文件,和相应的Mono.Data.Sqlite.dll、sqlite3.dll、System.Data.dll类库。
++++注意: 所有文件放到Plugins文件夹下,libsqlite3.so放在Android文件夹下。
++++Android发布的特殊性在于连接本地Sqlite数据库的时候,如果没有找到数据库文件,无法创建空的数据库。鉴于此,解决方案有两种:
--1、加载libsqlite.so之后,Android会恢复自动创建数据库功能。在编写代码时,可以通过判断是否有数据库文件来判断是否存在数据库文件,从而通过重新建表重新插入数据实现。但这种方案对于数据库内容较多的项目来说,增添了太多代码量,所以一般不使用这种方案。除非是表格内容较少时。
--2、同样需要上述的三个类库和libsqlite.so文件,但不需要重新建表和重新插入数据内容。当Android端安装应用程序时,需要一个“.apk”的安装文件,此文件内保存着我们从Unity开发平台导入的*.sqlite文件,所以我们可以通过www来下载该sqlite文件,从而通过IO流写入到Android本地的persistentDataPath沙盒路径。该文件保存着所有表格和数据,无需再次创建和插入,通常使用的都是这种方式,较为便捷。
++7.3、Android端连接本地数据库
++++准备: 把本地数据库放在Plugins->Android->assets中。
++++Android端连接本地数据库
#if UNITY_EDITOR //如果运行在编辑器中
string dbPath = Application.dataPath+ “/Plugins/Android/assets/” +“User.sqlite”; //通过路径找到本地数据库
DataBase db = new DataBase(“data source=” +dbPath); //获取DataBase对象
#elif UNITY_ANDROID //如果运行在Android设备中
string dbPath = Application.persistentDataPath+“/User.sqlite”; //将本地数据库拷贝至Android可找到的地方
//如果已知路径没有地方放数据库,那么我们从Unity中拷贝
if(!File.Exists(dbPath)){
WWW dbBytes = new WWW(“jar:file://” +Application.dataPath+ “!/assets/” +“User.sqlite”); //用www先从Unity中下载到数据库
File.WriteAllBytes(dbPath, dbBytes.bytes); //拷贝至规定的地方
DataBase db = new DataBase(“url=file:” +dbPath);
}
#endif
++++注意:
--二进制文件需要放在 Plugins->Android->assets中,然后根据下面的路径就可以在Android中读取。
--string Path = “jar:file://” + Application.dataPath + “!/assets/” + “xxxx您的文件”;
#立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++立钻哥哥推荐的拓展学习链接(Link_Url):
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
++++Unity引擎基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78881685
++++Unity面向组件开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78881752
++++Unity物理系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78881879
++++Unity2D平台开发:https://blog.csdn.net/vrunsoftyanlz/article/details/78882034
++++UGUI基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78884693
++++UGUI进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78884882
++++UGUI综合:https://blog.csdn.net/vrunsoftyanlz/article/details/78885013
++++Unity动画系统基础:https://blog.csdn.net/vrunsoftyanlz/article/details/78886068
++++Unity动画系统进阶:https://blog.csdn.net/vrunsoftyanlz/article/details/78886198
++++Navigation导航系统:https://blog.csdn.net/vrunsoftyanlz/article/details/78886281
++++Unity特效渲染:https://blog.csdn.net/vrunsoftyanlz/article/details/78886403
++++Unity数据存储:https://blog.csdn.net/vrunsoftyanlz/article/details/79251273
++++Unity中Sqlite数据库:https://blog.csdn.net/vrunsoftyanlz/article/details/79254162
++++WWW类和协程:https://blog.csdn.net/vrunsoftyanlz/article/details/79254559
++++Unity网络:https://blog.csdn.net/vrunsoftyanlz/article/details/79254902
++++C#事件:https://blog.csdn.net/vrunsoftyanlz/article/details/78631267
++++C#委托:https://blog.csdn.net/vrunsoftyanlz/article/details/78631183
++++C#集合:https://blog.csdn.net/vrunsoftyanlz/article/details/78631175
++++C#泛型:https://blog.csdn.net/vrunsoftyanlz/article/details/78631141
++++C#接口:https://blog.csdn.net/vrunsoftyanlz/article/details/78631122
++++C#静态类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630979
++++C#中System.String类:https://blog.csdn.net/vrunsoftyanlz/article/details/78630945
++++C#数据类型:https://blog.csdn.net/vrunsoftyanlz/article/details/78630913
++++Unity3D默认的快捷键:https://blog.csdn.net/vrunsoftyanlz/article/details/78630838
++++游戏相关缩写:https://blog.csdn.net/vrunsoftyanlz/article/details/78630687
++++设计模式简单整理:https://blog.csdn.net/vrunsoftyanlz/article/details/79839641
++++U3D小项目参考:https://blog.csdn.net/vrunsoftyanlz/article/details/80141811
++++UML类图:https://blog.csdn.net/vrunsoftyanlz/article/details/80289461
++++Unity知识点0001:https://blog.csdn.net/vrunsoftyanlz/article/details/80302012
++++U3D_Shader编程(第一篇:快速入门篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372071
++++U3D_Shader编程(第二篇:基础夯实篇):https://blog.csdn.net/vrunsoftyanlz/article/details/80372628
++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/
--_--VRunSoft : lovezuanzuan--_--