Unity WebGL Sqlite3替代方案iBoxDB

Unity WebGL Sqlite3替代方案iBoxDB,第1张

概述1.iBoxDB 简介 http://www.iboxdb.com/ 2.选择原因 sqlite3不支持WebGL (更改业务逻辑,存到服务端有工作量,只能更改前端存储,webgl用iboxDB,其它平台用sqlite3) iboxDB :JAVA   C#   Android   Unity   Xamarin   Mono   Nashorn   Linux   Windows 安装简单,un 1.iBoxDB 简介 http://www.iBoxdb.com/

2.选择原因

sqlite3不支持WebGL (更改业务逻辑,存到服务端有工作量,只能更改前端存储,webgl用iBoxDB,其它平台用sqlite3)

iBoxDB :JAVA C# AndroID Unity Xamarin Mono Nashorn linux windows 安装简单,unity只需要一个dll即可。

Web需要主动调用持久化(例如5分钟调用一次保存,或者当某个页面关闭时保存等等,根据开发者自定义,如果不保存,刷新浏览器 iBoxdb 将没有保存数据)。

Application.ExternalEval("FS.syncfs(false,function (err) {});");

3.简单用法 百度/谷歌也能搜索到一些例子,大都是封装了一个Helper类,我简单补充一些用法。
1.注意变量必须用 ?替代,防止sql注入。 Select("from Email where category == ? & type == ? order by created_at desc,ID desc",1,1);

2.字段数据类型,必须一致。 Class{ int a; long b; } Select("from Email where a == ? & b == ?",(long)1); //需要传long型
3.MysqL in 语句。这个语法数据库不支持,可以翻译成条件判断。 例如: MysqL :where category = 1 AND type in (1,2,3,4) order by create_at desc,ID desc limit 0,10 iBoxDb : var types = new int[]{1,4};
可以写个转化函数:var sql = from Emailwherecategory == ? & MessageTypesstrings(type.Length)order by create_at desc,10 转化后就是:from Email where category == ? & (type == ? | type == ? | type == ? | type == ?) order by create_at desc,10
private string MessageTypestoStrings(int length){		var result = "";		if (length == 0)			return result;		if (length > 1) {			for (var i = 0; i < length - 1; i++) {				result += "type==?" + "|";			}		}		result += "type==?";		return "(" + result + ")";	}
多参数问题:
Select(sql,types); 数组这么传参不对,可以转化成 5个参数。 Select(sql,ConvertParams(1,types)); //ok
private object[] ConvertParams(params object[] parameters){		var List = new List<object> ();		foreach (var item in parameters) {			if (item.GetType () == typeof(int[])) {				var items = item as int[];				foreach (var item1 in items) {					List.Add ((int)item1);				}			} else if (item.GetType () == typeof(long[])) {				var items = item as long[];				foreach (var item1 in items) {					List.Add ((long)item1);				}			} else {				List.Add (item);			}		}		return List.ToArray ();	}


4.group by 语法不支持 自己取出数据,然后用linq语句进行筛选。
var sums = from n in queryData           group n by new{n.category,n.type} into g	   select new {Total = g.Count ()};

from n in queryData	group n by new {n.category,n.type} 	into g	select g.OrderByDescending (t => t.ID).ThenByDescending (t => t.created_at).FirstOrDefault ()
大多数运算 都可以Select DataBase 然后进行 linq逻辑 *** 作。
5.逻辑 *** 作符 Select("from Email where (type == ?) & (reward_time > ? | life_time-?<=?)",1); //支持运算 4.我的helper类
public class iBoxDBHelper  {	private static iBoxDBHelper _ins;	public static iBoxDBHelper ins{		get{			if (null == _ins) {				_ins = new iBoxDBHelper ();			}			return _ins;		}	}	public static string BoxDBEmail = "Email";	private string DBBoxDir{		get{  			return Application.persistentDataPath;		}	}	private autoBox m_autoBox = null;	private DB m_db;	public autoBox Box{		get{  			return m_autoBox;		}	}	public voID InitDB(){		CreateDirectory ();		if (null == m_autoBox) {			DB.Root (DBBoxDir);			m_db = new DB (3);//3=自定义数字,在这没有具体意义。			m_db.GetConfig ().Ensuretable<DBEmail> (BoxDBEmail,"ID","category");			m_db.GetConfig ().EnsureIndex<DBEmail> (BoxDBEmail,"created_at","read_at");			m_autoBox = m_db.open();		}	}	public voID ChangeDB(){		m_db.dispose ();		m_autoBox = null;		InitDB ();	}	private voID CreateDirectory () {		if(!Directory.Exists (DBBoxDir)) {		Directory.CreateDirectory (DBBoxDir);		}	}	public bool Insert(string tablename,DBEmail data){		return _ins.m_autoBox.Insert (tablename,data);	}	public voID InsertMulti(string tablename,List<DBEmail> data){		using(var Box = _ins.m_autoBox.Cube())		{			Binder binder = Box.Bind(tablename);			foreach (var item in data) {				binder.Insert (item);			}			Box.Commit ();		}	}	public voID Update(string tablename,object data){		_ins.m_autoBox.Update (tablename,data);	}	public voID UpdateMulti(string tablename,List<object> data){		using(var Box = _ins.m_autoBox.Cube())		{			Binder binder = Box.Bind(tablename);			foreach (var item in data) {				binder.Update (item);			}			Box.Commit();		}	}	public DBEmail Getone(string sql,params object[] param){		var dbEmail = new DBEmail ();		var datas = _ins.m_autoBox.Select <DBEmail> (sql,param);		foreach (var item in datas) {			dbEmail = item;		}		return dbEmail;	}	public voID Delete(string tablename,string QL){		_ins.m_autoBox.Delete (tablename,QL);	}}
总结

以上是内存溢出为你收集整理的Unity WebGL Sqlite3替代方案iBoxDB全部内容,希望文章能够帮你解决Unity WebGL Sqlite3替代方案iBoxDB所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存