一鸿秆、SQLiteManager
SQLiteManager是一個(gè)支持多國語言基于Web的SQLite數(shù)據(jù)庫管理工具牡拇。它的特點(diǎn)包括多數(shù)據(jù)庫管理口四,創(chuàng)建和連接孵运;表格,數(shù)據(jù)窃祝,索引操作掐松;視圖,觸發(fā)器粪小,和自定義函數(shù)管理大磺。數(shù)據(jù)導(dǎo)入/導(dǎo)出;數(shù)據(jù)庫結(jié)構(gòu)導(dǎo)出探膊。
安裝SQLiteManager
在SVN的目錄下 _EXAMPLE\md\170614_Unity_ Database\Tools\
SQLiteManager的使用:
打開SQLiteManager杠愧,新建一個(gè)數(shù)據(jù)庫,文件格式為*.sqlite,最終要放在Unity編輯器的StreamingAssets目錄 Unity特殊文件夾的說明
數(shù)據(jù)庫文件在各平臺的路徑
--TIP:安卓平臺把打出的包.apk 改為.zip格式逞壁,解壓出來流济,會在 asset/下找到 數(shù)據(jù)庫文件
二锐锣、SQL語法:
基礎(chǔ)語句(主要用到的是第10 個(gè),有些在SQLiteManager里就可以提前操作)
1绳瘟、創(chuàng)建數(shù)據(jù)庫(create)
CREATE DATABASE database-name
create table if not exist students (ID integer, name text);
2雕憔、刪除數(shù)據(jù)庫(drop)
drop database dbname
drop table teachers;
3、備份sql server (backup)
— 創(chuàng)建 備份數(shù)據(jù)的 device
USE master
EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’
— 開始 備份
BACKUP DATABASE pubs TO testBack
4糖声、創(chuàng)建新表(create)
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根據(jù)已有的表創(chuàng)建新表:
A:create table tab_new like tab_old (使用舊表創(chuàng)建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5斤彼、刪除新表(drop)
drop table tabname
6、增加一個(gè)列(alter...column)
Alter table tabname add column col type
注:列增加后將不能刪除蘸泻。
DB2中列加上后數(shù)據(jù)類型也不能改變琉苇,唯一能改變的是增加varchar類型的長度。
7悦施、添加主鍵(alter)
Alter table tabname add primary key(col)
刪除主鍵(alter)
Alter table tabname drop primary key(col)
8并扇、創(chuàng)建索引
create [unique] index idxname on tabname(col….)
刪除索引
drop index idxname
注:索引是不可更改的,想更改必須刪除重新建抡诞。
9穷蛹、創(chuàng)建視圖
create view viewname as select statement
刪除視圖
drop view viewname
10、幾個(gè)簡單的基本的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]
總數(shù):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編輯器里的準(zhǔn)備
(在demo工程里都有)
Unity編輯器Plugins下需要的庫:
Mono.Data.Sqlite.dll
sqlite3.dll
System.Data.dll
Android平臺需要 Plugins/Android/libsqlite3.so
StreamingAssets/在SQLiteManager 里創(chuàng)建的數(shù)據(jù)庫名稱.sqlite
四乔遮、封裝數(shù)據(jù)庫連接的工具DataBaseTool
例子里的DataBaseTool腳本
(1)創(chuàng)建數(shù)據(jù)庫連接扮超。
(2)打開數(shù)據(jù)庫連接
(3)創(chuàng)建Command對象并設(shè)置sql語句
(4)調(diào)用ExecuteNonQuery ExecuteReader方法,執(zhí)行sql語句并獲得結(jié)果
(5)關(guān)閉連接。
五蹋肮、使用上述工具類進(jìn)行數(shù)據(jù)操作
參見例子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目錄下的數(shù)據(jù)庫文件
database_Name = "mydatabase.sqlite";
//這個(gè)地方可以連著寫sql語句,用分號隔開出刷,這樣數(shù)據(jù)庫連接就只用走一次
sql = "insert into Player values('qaq','1001','24');delete from Player where Name='wangwu' ;select * from Player ";
result = DataBaseTool.GetInstance(database_Name).ExcuteAllRresult(sql);
}
六、總結(jié)
DataBaseTool進(jìn)行了簡化
核心public List<Dictionary<string, object>> ExcuteAllRresult(string sql){}
構(gòu)造方法private DataBaseTool(string databaseName){}
Android平臺得注意數(shù)據(jù)庫的路徑public string AndriodPaltformSet(string databaseName){}
一些問題
1.數(shù)據(jù)庫不要實(shí)時(shí)更新坯辩,多用于存檔
2.設(shè)計(jì)表的時(shí)候空值的問題馁龟,查找的結(jié)果不會報(bào)錯(cuò),在SQLiteManager里看到為NULL
3.其他關(guān)于中途數(shù)據(jù)庫斷開連接的問題漆魔,可以自行嘗試坷檩,這些異常都會在 SqliteException 類里拋出 參考Try...Catch...的使用
在Unity中鏈接SQLite小型數(shù)據(jù)庫有其獨(dú)特的優(yōu)缺點(diǎn),以下是一個(gè)詳細(xì)的分析:
優(yōu)點(diǎn)
輕量級:
SQLite是一個(gè)輕量級的嵌入式數(shù)據(jù)庫改抡,不需要獨(dú)立的服務(wù)器進(jìn)程矢炼,非常適合小型項(xiàng)目和單機(jī)游戲。
簡單易用:
SQLite使用簡單阿纤,易于操作句灌,使用SQL語句進(jìn)行查詢、插入、更新和刪除胰锌,這對于有SQL基礎(chǔ)的開發(fā)者非常友好骗绕。
無須配置:
不需要額外的數(shù)據(jù)庫服務(wù)器配置,減少了開發(fā)和維護(hù)的復(fù)雜度资昧。只需將數(shù)據(jù)庫文件放入項(xiàng)目中即可使用酬土。
便于數(shù)據(jù)存儲與訪問:
適合存儲游戲狀態(tài)、設(shè)置格带、用戶數(shù)據(jù)等诺凡,方便進(jìn)行數(shù)據(jù)的持久化存儲和訪問。
跨平臺:
SQLite可以在多種平臺上運(yùn)行践惑,包括Windows、macOS嘶卧、Android和iOS尔觉,因此便于跨平臺游戲開發(fā)。
事務(wù)支持:
支持ACID(原子性芥吟、一致性侦铜、隔離性、持久性)事務(wù)钟鸵,能夠保證數(shù)據(jù)的完整性和一致性钉稍。
缺點(diǎn)
性能限制:
SQLite在處理大數(shù)據(jù)量時(shí)性能有限,不適合頻繁的寫操作棺耍,尤其在高并發(fā)場景下性能較差贡未。
多用戶支持有限:
SQLite適合單用戶或少量用戶操作,不支持復(fù)雜的并發(fā)環(huán)境蒙袍,可能導(dǎo)致數(shù)據(jù)沖突俊卤。
功能有限:
相較于其他數(shù)據(jù)庫(如MySQL、PostgreSQL)害幅,SQLite的功能較為簡單消恍,不支持存儲過程、觸發(fā)器等高級特性以现。
數(shù)據(jù)安全性:
SQLite的安全機(jī)制相對簡單狠怨,不支持復(fù)雜的用戶權(quán)限管理,適合低安全需求的應(yīng)用邑遏。
不適合網(wǎng)絡(luò)應(yīng)用:
不適用于需要網(wǎng)絡(luò)訪問的實(shí)時(shí)多人游戲佣赖,因?yàn)樗且粋€(gè)嵌入式數(shù)據(jù)庫,需要在本地存儲记盒。
總結(jié)
在Unity中使用SQLite小型數(shù)據(jù)庫非常適合開發(fā)單機(jī)茵汰、輕量級或跨平臺的游戲項(xiàng)目,能夠提供便捷的數(shù)據(jù)存儲和管理能力孽鸡。然而蹂午,開發(fā)者需要注意其性能和并發(fā)限制栏豺,并在合適的場景中選擇使用。對于需要高并發(fā)和復(fù)雜數(shù)據(jù)處理的應(yīng)用豆胸,可能需要考慮其他類型的數(shù)據(jù)庫解決方案奥洼。
性能分析
在Unity項(xiàng)目中鏈接數(shù)據(jù)庫的做法可以帶來多種影響,包括性能方面晚胡。以下是一些主要的分析點(diǎn):
- 數(shù)據(jù)庫類型和選擇
SQLite:適合客戶端存儲小型數(shù)據(jù)灵奖,可以脫離網(wǎng)絡(luò)獨(dú)立運(yùn)行,適合單機(jī)游戲估盘。
在線數(shù)據(jù)庫(如MySQL或PostgreSQL):適合需要多人在線實(shí)時(shí)交互的游戲瓷患,但需要網(wǎng)絡(luò)連接。 - 連接開銷
每次連接數(shù)據(jù)庫都需要時(shí)間遣妥,尤其是在線數(shù)據(jù)庫擅编。頻繁的連接、斷開會增加延遲箫踩,影響游戲體驗(yàn)爱态。
解決方案:使用連接池技術(shù),保持固定數(shù)量的數(shù)據(jù)庫連接境钟,可以減少重復(fù)連接帶來的開銷锦担。 - 數(shù)據(jù)讀取與寫入
讀取和寫入數(shù)據(jù)庫的操作比內(nèi)存操作要慢。每次查詢或更新都需要IO操作慨削,可能導(dǎo)致幀率降低或延遲增大洞渔。
解決方案:將數(shù)據(jù)庫操作放在異步線程中進(jìn)行,避免阻塞主線程缚态。同時(shí)痘煤,考慮使用緩存機(jī)制,減少數(shù)據(jù)庫訪問頻率猿规。 - 數(shù)據(jù)量與復(fù)雜度
大量復(fù)雜的查詢(如多表連接衷快、嵌套查詢等)會對CPU造成負(fù)擔(dān),并潛在引發(fā)性能下降姨俩。
解決方案:簡化查詢邏輯蘸拔,減少數(shù)據(jù)復(fù)雜性;使用合適的索引來加快查詢速度环葵。 - 操作頻率
高頻率的數(shù)據(jù)庫操作(例如每幀都查詢數(shù)據(jù)庫)會導(dǎo)致性能下降调窍。
解決方案:僅在必要時(shí)(如狀態(tài)變化時(shí))進(jìn)行數(shù)據(jù)庫操作,避免每幀調(diào)用张遭。 - 數(shù)據(jù)安全與穩(wěn)定性
需要處理數(shù)據(jù)庫的異常和錯(cuò)誤邓萨,確保數(shù)據(jù)一致性。這可能增加開發(fā)工作量,但對于性能影響相對較小缔恳。 - 數(shù)據(jù)備份與更新
大數(shù)據(jù)量的備份與更新操作也會影響性能宝剖。建議在玩家不活躍的時(shí)候(如菜單界面)進(jìn)行這些操作。
總結(jié)
綜上所述歉甚,在Unity中使用數(shù)據(jù)庫能提高數(shù)據(jù)管理的靈活性和效果万细,但不當(dāng)?shù)氖褂梅绞綍绊懶阅堋Mㄟ^優(yōu)化連接方式纸泄、合理使用異步處理赖钞、減少數(shù)據(jù)庫訪問頻率、簡化查詢以及使用緩存聘裁,可以有效緩解性能問題雪营。在設(shè)計(jì)數(shù)據(jù)庫交互時(shí),需權(quán)衡數(shù)據(jù)需求與性能之間的關(guān)系衡便。