Unity游戏开发:SQLite数据库在本地数据存储中的应用

发表时间: 2020-02-13 18:14

前言

  • 单机游戏开发过程中,一款高效便捷的本地数据存储库一定是必不可少的。今天介绍unity结合SQLite数据库来完成本地数据的存储。

开发环境

  • 引擎:Unity 2018.4.16f1
  • 插件:sqlitekit

SQLite的优势

  • SQLite是一种嵌入式数据库,它的数据库就是一个文件。
  • 基于sqlitekit可实现跨平台本地数据存储,不用过多考虑跨平台问题
  • 基于sqlitekit可实现数据加密存储,能有效的提高本地数据的安全
  • 实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎

相关逻辑及关键代码

  • 创建db库文件:在编辑器模式下创建属于自己工程的db库文件,将其放入StreamingAssets文件夹下,便于后续开发以及打包对应平台后将库文件移植到对应平台的可读可写文件夹下。
     	  SQLiteDB sqLiteDb = new SQLiteDB();        string filename = Application.streamingAssetsPath + "/gameSql.db";        if (System.IO.File.Exists(filename))        {            System.IO.File.Delete(filename);        }        sqLiteDb.Open(filename);
  • 创建数据表:根据需求创建一张用于存储数据的表单,创建成功后相应的数据就可通过增删改查来修改表内的数据内容了。
        //id INTEGER PRIMARY KEY设置自增Id,DataKey BIGINT, Data BLOB,Size INT表示 字段名称 字段类型,字段名称 字段类型,字段名称 字段类型				string query_create = $"{CREATE TABLE IF NOT EXISTS}{表名}(id INTEGER PRIMARY KEY, DataKey BIGINT, Data BLOB,Size INT);";        SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);        query.Step();        query.Release();        query = new SQLiteQuery(sqLiteDb, queryCreate);        query.Step();        query.Release();
  • 数据表内插入数据:向已经创建好的表内插入一行新的数据
        string data = "需要存储的数据";				long id				string queryInsert = $"INSERT INTO{tableName} (DataKey,Data) VALUES(?,?);";        SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);        query.Step();        query.Release();        query = new SQLiteQuery(sqLiteDb, queryInsert);        query.Bind(id);        query.Bind(data);        query.Step();        query.Release();        netData.OnRecycling();
  • 更新数据表内已有的数据:表内已有存储好的数据,对其数据进行更新修改
        long id = 存储数据的key值				string data = "需要存储的数据";       				string query_update = $"UPDATE {表名} SET Data = ? WHERE DataKey = ?;";//        SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);        query.Step();        query.Release();        query = new SQLiteQuery(sqLiteDb, query_update);        query.Bind(data);        query.Bind(id);        query.Step();        query.Release();
  • 查找数据表内的数据:查询数据表内的数据内容,未查询到数据时返回空数据
				string value = string.Empty;				long id = 存储数据的key值			  //若删除 WHERE DataKey = ?将查询整张表内的数据				string query_select = $"SELECT * FROM {表名} WHERE DataKey = ?;";        SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);        query.Step();        query.Release();        query = new SQLiteQuery(sqLiteDb, query_select);        query.Bind(id);        if (query.Step())        {            value = query.GetBlob("Data");        }        query.Release();
  • 删除数据表内的数据:将数据表内的数据删除掉(删除有风险,谨防删库跑路事件发送)。
        long id = 存储数据的key值				//若删除 WHERE DataKey = ?将删除整张表内的数据				string query_delete = $"DELETE FROM {表名} WHERE DataKey = ?;";        SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);        query.Step();        query.Release();        query = new SQLiteQuery(sqLiteDb, query_delete);        query.Bind(id);        query.Step();        query.Release();
  • 关闭数据数据库:退出程序时记得将数据库关闭释放
sqLiteDb.Close();
  • 打包后安卓和ios移动平台需要将db文件放入可读可写文件夹下
        string outFile =  string.Empty;#if UNITY_ANDROID        outFile = Application.persistentDataPath + "/gameSql.db";#elif UNITY_IPHONE        outFile = "file://" + Application.persistentDataPath + "/gameSql.db";#endif        string resPath = Application.streamingAssetsPath + "/gameSql.db";        if (File.Exists(outFile)) File.Delete(outFile);        UnityWebRequest request = UnityWebRequest.Get(resPath);        request.timeout = 30;        yield return request.SendWebRequest();				System.IO.File.WriteAllBytes(outFile,request.downloadHandler.data);

结束语

  • 灵活运用sqlitekit能使自己的本地数据存储更加便利,后续会介绍sqlitekit和protobuf结合在Unity中的使用。