一、SQLiteManager
SQLiteManager是一个支持多国语言基于Web的SQLite数据库管理工具。它的特点包括多数据库管理,创建和连接;表格,数据,索引操作;视图,触发器,和自定义函数管理。数据导入/导出;数据库结构导出。
安装SQLiteManager
在SVN的目录下 _EXAMPLE\md\170614_Unity_ Database\Tools\
SQLiteManager的使用:
打开SQLiteManager,新建一个数据库,文件格式为*.sqlite,最终要放在Unity编辑器的StreamingAssets目录 Unity特殊文件夹的说明
数据库文件在各平台的路径
--TIP:安卓平台把打出的包.apk 改为.zip格式,解压出来,会在 asset/下找到 数据库文件
二、SQL语法:
基础语句(主要用到的是第10 个,有些在SQLiteManager里就可以提前操作)
1、创建数据库(create)
CREATE DATABASE database-name
create table if not exist students (ID integer, name text);
2、删除数据库(drop)
drop database dbname
drop table teachers;
3、备份sql server (backup)
— 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’
— 开始 备份
BACKUP DATABASE pubs TO testBack
4、创建新表(create)
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、删除新表(drop)
drop table tabname
6、增加一个列(alter...column)
Alter table tabname add column col type
注:列增加后将不能删除。
DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、添加主键(alter)
Alter table tabname add primary key(col)
删除主键(alter)
Alter table tabname drop primary key(col)
8、创建索引
create [unique] index idxname on tabname(col….)
删除索引
drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、创建视图
create view viewname as select statement
删除视图
drop view viewname
10、几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2)values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like’%value1%’ —like的语法很精妙,查资料!
排序:select @ from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
三、Unity编辑器里的准备
(在demo工程里都有)
Unity编辑器Plugins下需要的库:
Mono.Data.Sqlite.dll
sqlite3.dll
System.Data.dll
Android平台需要 Plugins/Android/libsqlite3.so
StreamingAssets/在SQLiteManager 里创建的数据库名称.sqlite
四、封装数据库连接的工具DataBaseTool
例子里的DataBaseTool脚本
(1)创建数据库连接。
(2)打开数据库连接
(3)创建Command对象并设置sql语句
(4)调用ExecuteNonQuery ExecuteReader方法,执行sql语句并获得结果
(5)关闭连接。
五、使用上述工具类进行数据操作
参见例子demo里的 DataTest脚本
using UnityEngine;
using System.Collections.Generic;
using LitJson;
using UnityEngine.UI;
using System.IO;
public class DataTest : MonoBehaviour
{
List<Dictionary<string, object>> result;
string database_Name;
string sql;
void Start()
{
//StreamingAssets目录下的数据库文件
database_Name = "mydatabase.sqlite";
//这个地方可以连着写sql语句,用分号隔开,这样数据库连接就只用走一次
sql = "insert into Player values('qaq','1001','24');delete from Player where Name='wangwu' ;select * from Player ";
result = DataBaseTool.GetInstance(database_Name).ExcuteAllRresult(sql);
}
六、总结
DataBaseTool进行了简化
核心public List<Dictionary<string, object>> ExcuteAllRresult(string sql){}
构造方法private DataBaseTool(string databaseName){}
Android平台得注意数据库的路径public string AndriodPaltformSet(string databaseName){}
一些问题
1.数据库不要实时更新,多用于存档
2.设计表的时候空值的问题,查找的结果不会报错,在SQLiteManager里看到为NULL
3.其他关于中途数据库断开连接的问题,可以自行尝试,这些异常都会在 SqliteException 类里抛出 参考Try...Catch...的使用
在Unity中链接SQLite小型数据库有其独特的优缺点,以下是一个详细的分析:
优点
轻量级:
SQLite是一个轻量级的嵌入式数据库,不需要独立的服务器进程,非常适合小型项目和单机游戏。
简单易用:
SQLite使用简单,易于操作,使用SQL语句进行查询、插入、更新和删除,这对于有SQL基础的开发者非常友好。
无须配置:
不需要额外的数据库服务器配置,减少了开发和维护的复杂度。只需将数据库文件放入项目中即可使用。
便于数据存储与访问:
适合存储游戏状态、设置、用户数据等,方便进行数据的持久化存储和访问。
跨平台:
SQLite可以在多种平台上运行,包括Windows、macOS、Android和iOS,因此便于跨平台游戏开发。
事务支持:
支持ACID(原子性、一致性、隔离性、持久性)事务,能够保证数据的完整性和一致性。
缺点
性能限制:
SQLite在处理大数据量时性能有限,不适合频繁的写操作,尤其在高并发场景下性能较差。
多用户支持有限:
SQLite适合单用户或少量用户操作,不支持复杂的并发环境,可能导致数据冲突。
功能有限:
相较于其他数据库(如MySQL、PostgreSQL),SQLite的功能较为简单,不支持存储过程、触发器等高级特性。
数据安全性:
SQLite的安全机制相对简单,不支持复杂的用户权限管理,适合低安全需求的应用。
不适合网络应用:
不适用于需要网络访问的实时多人游戏,因为它是一个嵌入式数据库,需要在本地存储。
总结
在Unity中使用SQLite小型数据库非常适合开发单机、轻量级或跨平台的游戏项目,能够提供便捷的数据存储和管理能力。然而,开发者需要注意其性能和并发限制,并在合适的场景中选择使用。对于需要高并发和复杂数据处理的应用,可能需要考虑其他类型的数据库解决方案。
性能分析
在Unity项目中链接数据库的做法可以带来多种影响,包括性能方面。以下是一些主要的分析点:
- 数据库类型和选择
SQLite:适合客户端存储小型数据,可以脱离网络独立运行,适合单机游戏。
在线数据库(如MySQL或PostgreSQL):适合需要多人在线实时交互的游戏,但需要网络连接。 - 连接开销
每次连接数据库都需要时间,尤其是在线数据库。频繁的连接、断开会增加延迟,影响游戏体验。
解决方案:使用连接池技术,保持固定数量的数据库连接,可以减少重复连接带来的开销。 - 数据读取与写入
读取和写入数据库的操作比内存操作要慢。每次查询或更新都需要IO操作,可能导致帧率降低或延迟增大。
解决方案:将数据库操作放在异步线程中进行,避免阻塞主线程。同时,考虑使用缓存机制,减少数据库访问频率。 - 数据量与复杂度
大量复杂的查询(如多表连接、嵌套查询等)会对CPU造成负担,并潜在引发性能下降。
解决方案:简化查询逻辑,减少数据复杂性;使用合适的索引来加快查询速度。 - 操作频率
高频率的数据库操作(例如每帧都查询数据库)会导致性能下降。
解决方案:仅在必要时(如状态变化时)进行数据库操作,避免每帧调用。 - 数据安全与稳定性
需要处理数据库的异常和错误,确保数据一致性。这可能增加开发工作量,但对于性能影响相对较小。 - 数据备份与更新
大数据量的备份与更新操作也会影响性能。建议在玩家不活跃的时候(如菜单界面)进行这些操作。
总结
综上所述,在Unity中使用数据库能提高数据管理的灵活性和效果,但不当的使用方式会影响性能。通过优化连接方式、合理使用异步处理、减少数据库访问频率、简化查询以及使用缓存,可以有效缓解性能问题。在设计数据库交互时,需权衡数据需求与性能之间的关系。