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
public SimpleSQLManager chatDB = null;
检查库中是否有某张表
//检查库中是否有某张表,没有则创建表
private void CheckHaveTable<T>(SimpleSQLManager sm)
{
// 获取表名
string tableName = typeof(T).Name;
// 构建查询语句
string query = "SELECT name FROM sqlite_master WHERE type='table' AND name=?";
// 执行查询
var tableNames = sm.Query<ColumnInfo>(query, tableName);
if(tableNames.Count <=0)
{
CreateTable<T>(sm);
}
}
在库中创建表
//在库中创建表
private void CreateTable<T>(SimpleSQLManager sm)
{
sm.CreateTable<T>();
}
声明数据表结构体
public class LocalDB
{
[NotNull]
public int accountId { get; set; }
}
public class LocalChat : LocalDB
{
//[PrimaryKey]
public int friendId { get; set; }
public bool isSpeaker { get; set; }
public string content { get; set; }
public long time { get; set; }
}
这里数据结构基类有一个 accountId ,意义是账号id,不同账号的聊天记录用这个字段区分了
初始化数据库
private void Start()
{
CheckHaveTable<LocalChat>(chatDB);
}
增加聊天数据
public void AddChat(int friendId, bool isSpeaker, string content,long time)
{
LocalChat chat = new LocalChat
{
accountId = AccountID,
friendId = friendId,
isSpeaker = isSpeaker,
content = content,
time = time
};
chatDB.Insert(chat);
}
删除聊天
public void DelectChat(int friendId)
{
string sql = "DELETE FROM LocalChat WHERE accountId = ? AND friendId = ?";
chatDB.Execute(sql, AccountID ,friendId);
//LocalChat chat = new LocalChat
//{
// friendId = friendId,
//};
//chatDB.Delete<LocalChat>(chat);
}
这里提供了两段代码,用 sql语句和插件提供的方法可自行选择
获取聊天
public List<LocalChat> QueryChat(int friendId)
{
string sql = "SELECT * FROM LocalChat WHERE accountId = ? AND friendId = ? ";
List<LocalChat> friends = chatDB.Query<LocalChat>(sql, AccountID ,friendId);
return friends;
}
基本就这些逻辑了,其他API可自行官网查看,这里只提供一份思路
写一个测试脚本测试一下吧
private void OnGUI()
{
GUI.skin.button.fontSize = 36;
GUI.skin.textField.fontSize = 36;
if (GUI.Button(new Rect(200, 0, 200, 100), "添加聊天"))
{
TimeSpan mTimeSpan = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0);
long time = (long)mTimeSpan.TotalSeconds;
LocalSave.Instance.AddChat(101, true, "聊天内容", time);
}
if (GUI.Button(new Rect(200, 100, 200, 100), "删除聊天"))
{
LocalSave.Instance.DelectChat(101);
}
if (GUI.Button(new Rect(200, 200, 200, 100), "查询聊天"))
{
List<LocalChat> chats = LocalSave.Instance.QueryChat(101);
foreach (LocalChat chat in chats)
{
DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(chat.time).LocalDateTime;
TimeSpan timeOfDay = dateTime.TimeOfDay;
string formattedTime = timeOfDay.ToString(@"hh\:mm\:ss");
guitext += $"{(chat.isSpeaker ? "我说" : "他说")} :{chat.content}--{formattedTime}\n"; // ----{friend.friendName} \n";
}
}
guitext = GUI.TextField(new Rect(600, 0, 1000, 800), guitext);
}
运行项目,点击几次添加聊天,在点击查询聊天就可以看到数据了
下载 DB Browser (SQLite) 软件可以查看数据库的内容,打开软件,把数据库文件拖到软件中打开看一下吧
总结下,与好友发生聊天的时候,只需要服务器同步一次给到客户端,客户端在收到聊天消息之后写入本地数据库,服务器则不需要保存这些聊天记录,之后打开与好友的聊天界面,通过好友id和账号id,获取到对应的聊天记录就好了,可通过发送时间等数据进行排序显示
插件官网:https://echo17.itch.io/simplesql-unityhttps://echo17.itch.io/simplesql-unity
DB Browser 下载地址:https://download.sqlitebrowser.org/DB.Browser.for.SQLite-3.12.2-win64.msihttps://download.sqlitebrowser.org/DB.Browser.for.SQLite-3.12.2-win64.msi文章来源:https://www.toymoban.com/news/detail-848053.html
注:科学上网文章来源地址https://www.toymoban.com/news/detail-848053.html
到了这里,关于Unity 好友列表、聊天记录使用本地数据库储存 --SimpleSQL SQLite的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!