多平臺(tái)數(shù)據(jù)存儲(chǔ)插件IBoxDB學(xué)習(xí)

記錄多個(gè)物體的不同屬性江咳,主要是屬性不同意峭火,使用SQLite數(shù)據(jù)庫的話爱致,不同屬性的物體就需要建不同的表烤送,只能使用鍵值對(duì)類型來存儲(chǔ)。網(wǎng)上查了查糠悯,在unity本地可以使用的noSQL數(shù)據(jù)庫寥寥無幾(如果有朋友知道帮坚,可以推薦給我啊)互艾,而這個(gè)IBoxDB多平臺(tái)運(yùn)行试和,是NoSQL類型的,正好滿足要求纫普。給出官方網(wǎng)址鏈接阅悍。,還有這位朋友的注意事項(xiàng)局嘁。

IBOXDB下載地址

代碼中注釋很清楚溉箕,就不啰嗦了。先是簡單的工具類

using UnityEngine;
using System.Collections;
using iBoxDB.LocalServer;
using System.Collections.Generic;
using System;

/// <summary>
/// 實(shí)現(xiàn)一個(gè)Save和Read方法 
/// </summary>
public class MyIBoxDB
{
    public const string TABLE_BED_SCENE = "TABLE_BED_SCENE";
    private static MyIBoxDB _Instance;

    private DB db = null;
    private DB.AutoBox autoBox = null;//該對(duì)象可以進(jìn)行CRUD操作悦昵,使用完畢不需要釋放對(duì)象

    private MyIBoxDB()
    {
        if (db == null)
        {
            DB.Root(Application.persistentDataPath);//數(shù)據(jù)庫存儲(chǔ)路徑
            db = new DB(1);//數(shù)據(jù)庫地址肴茄,或者說ID                     
            db.GetConfig().EnsureTable<BaseObject>(TABLE_BED_SCENE, "ObjectName(20)");//先建表后使用,并且表的主鍵為ObjectName,長度20
        }

        if (autoBox == null)
            autoBox = db.Open();
    }

    public static MyIBoxDB GetInstance()
    {
        if (_Instance == null)
            _Instance = new MyIBoxDB();

        return _Instance;
    }

    /// <summary>
    /// 刪除數(shù)據(jù)庫但指,IBoxDB中沒有直接刪除一個(gè)表的接口寡痰,所以這個(gè)方法顯得格外親切~
    /// 注意:刪除數(shù)據(jù)庫之前要關(guān)閉該數(shù)據(jù)庫
    /// </summary>
    /// <param name="address">數(shù)據(jù)庫地址</param>
    public void DeleteDataBase(int address)
    {
        iBoxDB.DBDebug.DDebug.DeleteDBFiles(address);
    }

    /// <summary>
    /// 存儲(chǔ)一個(gè)列表的數(shù)據(jù)
    /// </summary>
    /// <param name="tableName">向哪個(gè)表存數(shù)據(jù)</param>
    /// <param name="data">要存儲(chǔ)的數(shù)據(jù)集合</param>
    public void Save(string tableName, List<BaseObject> data)
    {
        IBox iBox = _Instance.GetBox();
        Binder binder = iBox.Bind(tableName);//綁定表

        foreach (BaseObject ob in data)
        {
            //如果表中之前有過該記錄抗楔,則Update;沒有則Insert
            if (_Instance.autoBox.SelectCount("from " + tableName + " where ObjectName == ?", ob.ObjectName) <= 0)
                binder.Insert(ob);
            else
                binder.Update(ob);
        }

        iBox.Commit();
        iBox.Dispose();
    }

    /// <summary>
    /// 存儲(chǔ)一個(gè)對(duì)象的數(shù)據(jù)
    /// </summary>
    /// <param name="tableName">向哪個(gè)表存數(shù)據(jù)</param>
    /// <param name="ob">數(shù)據(jù)</param>
    public void Save(string tableName, BaseObject ob)
    {
        if (_Instance.autoBox.SelectCount("from " + tableName + " where ObjectName == ?", ob.ObjectName) <= 0)
            _Instance.autoBox.Insert<BaseObject>(tableName, ob);
        else
            _Instance.autoBox.Update<BaseObject>(tableName, ob);
    }

    /// <summary>
    /// 獲取數(shù)據(jù)
    /// </summary>
    /// <param name="QL">QL語句</param>
    /// <param name="param">QL參數(shù)</param>
    /// <returns></returns>
    public IBEnumerable<BaseObject> Get(string QL, string param)
    {
        return _Instance.autoBox.Select<BaseObject>(QL, param);
    }

    /// <summary>
    /// IBox可以進(jìn)行數(shù)據(jù)庫的事務(wù)操作
    /// </summary>
    private IBox GetBox()
    {
        return _Instance.autoBox.Cube();
    }
}

//基本數(shù)據(jù)類型
public class BaseObject : Dictionary<string, object>
{
    public string ObjectName
    {
        get
        {
            return (string)base["ObjectName"];
        }
        set
        {
            if (value.Length > 20)
            {
                throw new ArgumentOutOfRangeException();
            }
            base["ObjectName"] = value;
        }
    }
}

然后是測試類拦坠。

using UnityEngine;
using System.Collections;
using iBoxDB.LocalServer;
using System.Collections.Generic;

//Insert必須表里沒有相同ID的記錄连躏;Update必須表里有相同ID的記錄
public class Test : MonoBehaviour
{
    void Start ()
    {
        //TestUsingAutoBox();
        TestUsingBox();

        ShowResult();
    }

    private void TestUsingBox()
    {
        List<BaseObject> data = new List<BaseObject>();

        BaseObject item = new BaseObject() { ObjectName = "Player8" };
        item["position_x"] = 2;
        item["rotation_x"] = 34.2f;
        item["enable"] = false;
        item["tag"] = "item1_tag";

        BaseObject item2 = new BaseObject() { ObjectName = "Player9" };
        item2["position_x"] = 23;
        item2["rotation_x"] = 45.2f;
        item2["enable"] = false;
        item2["tag"] = "item1_tag";

        data.Add(item);
        data.Add(item2);

        MyIBoxDB.GetInstance().Save(MyIBoxDB.TABLE_BED_SCENE, data);
    }

    private void TestUsingAutoBox()
    {
        BaseObject item = new BaseObject() { ObjectName = "Player6" };
        item["position_x"] = 34;
        item["rotation_x"] = 89.5f;
        item["enable"] = true;
        item["tag"] = "item1_tag";

        MyIBoxDB.GetInstance().Save(MyIBoxDB.TABLE_BED_SCENE, item);
    }

    private void ShowResult()
    {
        foreach (BaseObject mItem in MyIBoxDB.GetInstance().Get("from " + MyIBoxDB.TABLE_BED_SCENE + " where ObjectName == ?", "Player8"))//只支持傳參
        {
            int position_x = (int)mItem["position_x"];
            float rotation_x = (float)mItem["rotation_x"];
            bool enable = (bool)mItem["enable"];
            string tag = mItem["tag"] as string;

            string s = "position_x = " + position_x + "  rotation_x = " + rotation_x + "  enable = " + enable + "  tag = " + tag;
            print(s);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贞滨,隨后出現(xiàn)的幾起案子入热,更是在濱河造成了極大的恐慌,老刑警劉巖晓铆,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺良,死亡現(xiàn)場離奇詭異,居然都是意外死亡骄噪,警方通過查閱死者的電腦和手機(jī)尚困,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來链蕊,“玉大人事甜,你說我怎么就攤上這事√显希” “怎么了逻谦?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陪蜻。 經(jīng)常有香客問我跨跨,道長,這世上最難降的妖魔是什么囱皿? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮忱嘹,結(jié)果婚禮上嘱腥,老公的妹妹穿的比我還像新娘。我一直安慰自己拘悦,他們只是感情好齿兔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著础米,像睡著了一般分苇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屁桑,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天医寿,我揣著相機(jī)與錄音,去河邊找鬼蘑斧。 笑死靖秩,一個(gè)胖子當(dāng)著我的面吹牛须眷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沟突,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼花颗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惠拭?” 一聲冷哼從身側(cè)響起扩劝,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎职辅,沒想到半個(gè)月后棒呛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罐农,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年条霜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涵亏。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宰睡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出气筋,到底是詐尸還是另有隱情拆内,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布宠默,位于F島的核電站麸恍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搀矫。R本人自食惡果不足惜抹沪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓤球。 院中可真熱鬧融欧,春花似錦、人聲如沸卦羡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绿饵。三九已至欠肾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拟赊,已是汗流浹背刺桃。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吸祟,地道東北人虏肾。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓廓啊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親封豪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谴轮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容