Unity 挚友列表、谈天记录使用本地数据库储存 --SimpleSQL SQLite ...

打印 上一主题 下一主题

主题 954|帖子 954|积分 2862

        Unity官方提供提供了插件 SimpleSQL,使用的是SQLite本地数据库的功能,插件这里就不做过多先容了,移步Unity AssetStore 自行查看吧 SimpleSQL | 整合 | Unity Asset Store
        这里主要讲一下插件的用法和我们在实际开发功能中需要用到的东西
        谈天系统,一台装备用时间长了, 谈天记录肯定会许多,这些数据如果全部储存与服务器上的话,服务器怕是遭不住,以是就需要用的本地数据库了

基础用法

1.SimpleSQL插件导入Unity
2.点击Tools-SimpleSQL-Create Empty Database,会在Asset目录创件一个文件,这个文件是默认的数据库文件,可以预天生一些数据表存于这个基础文件里
3.点击Tools-SimpleSQL-Create SimpleSQL Database Manager ,会在视图中创建一个空物体(DB Manager)

解释下这几个参数都是干嘛用的


  • Database File :默认数据库文件,也就是上面创建的文件
  • Override Base Path :数据库文件存放的目录,不填默认 Application.persistentDataPath目录
  • Change Working Name :运行时会读取的文件,勾选之后填上名称,会将文件改名
  • Overwrite if Exists:运行时用默认数据库文件更换运行时的文件(动态修改的数据库别勾选)
  • Debug Trace:调试数据
一般我们设置是这样的

4.点击Tools-SimpleSQL-Options 设置当前环境,我们用pc端做演示,就选择pc端了,下面的选项是否需要 .Net系统数据包,一般环境下也用不到

好了,到这一步可以先运行一下项目,可以在读写目录看到运行时的sql数据库文件了



好了,下面先容一下怎么添加,修改,获取数据吧
创建一个c#脚本,获取加入景中的 SimpleSQLManager 对象,我这里命名为 chatDB

  1. public SimpleSQLManager chatDB = null;
复制代码
检查库中是否有某张表

  1. //检查库中是否有某张表,没有则创建表
  2.     private void CheckHaveTable<T>(SimpleSQLManager sm)
  3.     {
  4.         // 获取表名
  5.         string tableName = typeof(T).Name;
  6.         // 构建查询语句
  7.         string query = "SELECT name FROM sqlite_master WHERE type='table' AND name=?";
  8.         // 执行查询
  9.         var tableNames = sm.Query<ColumnInfo>(query, tableName);
  10.         if(tableNames.Count <=0)
  11.         {
  12.             CreateTable<T>(sm);
  13.         }
  14.     }
复制代码
在库中创建表

  1. //在库中创建表
  2.     private void CreateTable<T>(SimpleSQLManager sm)
  3.     {
  4.         sm.CreateTable<T>();
  5.     }
复制代码
声明数据表结构体

  1. public class LocalDB
  2. {
  3.     [NotNull]
  4.     public int accountId { get; set; }
  5. }
  6. public class LocalChat : LocalDB
  7. {
  8.     //[PrimaryKey]
  9.     public int friendId { get; set; }
  10.     public bool isSpeaker { get; set; }
  11.     public string content { get; set; }
  12.     public long time { get; set; }
  13. }
复制代码
        这里数据结构基类有一个 accountId ,意义是账号id,不同账号的谈天记录用这个字段区分了
初始化数据库

  1. private void Start()
  2.     {
  3.         CheckHaveTable<LocalChat>(chatDB);
  4.     }
复制代码
增加谈天数据

  1.   public void AddChat(int friendId, bool isSpeaker, string content,long time)
  2.     {
  3.         LocalChat chat = new LocalChat
  4.         {
  5.             accountId = AccountID,
  6.             friendId = friendId,
  7.             isSpeaker = isSpeaker,
  8.             content = content,
  9.             time = time
  10.         };
  11.         chatDB.Insert(chat);
  12.     }
复制代码
删除谈天

  1. public void DelectChat(int friendId)
  2.     {
  3.         string sql = "DELETE FROM LocalChat WHERE accountId = ? AND friendId = ?";
  4.         chatDB.Execute(sql, AccountID ,friendId);
  5.         //LocalChat chat = new LocalChat
  6.         //{
  7.         //    friendId = friendId,
  8.         //};
  9.         //chatDB.Delete<LocalChat>(chat);
  10.     }
复制代码
        这里提供了两段代码,用 sql语句和插件提供的方法可自行选择
获取谈天

  1.   public List<LocalChat> QueryChat(int friendId)
  2.     {
  3.         string sql = "SELECT * FROM LocalChat WHERE accountId = ? AND friendId = ? ";
  4.         List<LocalChat> friends = chatDB.Query<LocalChat>(sql, AccountID ,friendId);
  5.         return friends;
  6.     }
复制代码
根本就这些逻辑了,其他API可自行官网查看,这里只提供一份思绪
写一个测试脚本测试一下吧
  1. private void OnGUI()
  2.     {
  3.         GUI.skin.button.fontSize = 36;
  4.         GUI.skin.textField.fontSize = 36;
  5.         
  6.         if (GUI.Button(new Rect(200, 0, 200, 100), "添加聊天"))
  7.         {
  8.             TimeSpan mTimeSpan = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0);
  9.             long time = (long)mTimeSpan.TotalSeconds;
  10.             LocalSave.Instance.AddChat(101, true, "聊天内容", time);
  11.         }
  12.         if (GUI.Button(new Rect(200, 100, 200, 100), "删除聊天"))
  13.         {
  14.             LocalSave.Instance.DelectChat(101);
  15.         }
  16.         if (GUI.Button(new Rect(200, 200, 200, 100), "查询聊天"))
  17.         {
  18.             List<LocalChat> chats = LocalSave.Instance.QueryChat(101);
  19.             foreach (LocalChat chat in chats)
  20.             {
  21.                 DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(chat.time).LocalDateTime;
  22.                 TimeSpan timeOfDay = dateTime.TimeOfDay;
  23.                 string formattedTime = timeOfDay.ToString(@"hh\:mm\:ss");
  24.                 guitext += $"{(chat.isSpeaker ? "我说" : "他说")} :{chat.content}--{formattedTime}\n"; // ----{friend.friendName} \n";
  25.             }
  26.         }
  27.         guitext = GUI.TextField(new Rect(600, 0, 1000, 800), guitext);
  28.     }
复制代码
运行项目,点击几次添加谈天,在点击查询谈天就可以看到数据了


下载 DB Browser (SQLite) 软件可以查看数据库的内容,打开软件,把数据库文件拖到软件中打开看一下吧


总结下,与挚友发生谈天的时候,只需要服务器同步一次给到客户端,客户端在收到谈天消息之后写入本地数据库,服务器则不需要保存这些谈天记录,之后打开与挚友的谈天界面,通过挚友id和账号id,获取到对应的谈天记录就好了,可通过发送时间等数据举行排序显示

插件官网:https://echo17.itch.io/simplesql-unity
https://echo17.itch.io/simplesql-unity
DB Browser 下载地址:https://download.sqlitebrowser.org/DB.Browser.for.SQLite-3.12.2-win64.msi
https://download.sqlitebrowser.org/DB.Browser.for.SQLite-3.12.2-win64.msi
注:科学上网

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表