1.iBoxDB 简介
http://www.iBoxdb.com/
2.选择原因
sqlite3不支持WebGL (更改业务逻辑,存到后端工作量有点大,只能更改前端存储,webgl用iBoxDB,其它平台用sqlite3)
iBoxDB :JAVA C# Android Unity Xamarin Mono Nashorn Linux Windows
安装简单,unity只需要一个dll即可。
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 ();
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 (BoxDBEmail,"id","category");
m_db.GetConfig ().EnsureIndex (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 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 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 (sql,param);
foreach (var item in datas) {
dbEmail = item;
}
return dbEmail;
}
public void Delete(string tableName,string QL){
_ins.m_autoBox.Delete (tableName,QL);
}
}
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250