SQLite 是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着您不需要在系统中配置,就可以使用。

特点

不需要一个单独的服务器进程或操作的系统(无服务器的)。
SQLite 不需要配置,这意味着不需要安装或管理。
一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
SQLite 是自给自足的,这意味着不需要任何外部的依赖。
SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。


Unity中使用

using System;
using System.Collections.Generic;
using UnityEngine;
using Mono.Data.Sqlite;/// <summary>
/// 数据库管理器
/// </summary>
public class DBManager :MonoBehaviour{private static DBManager _instance;public static DBManager Instance{get{if (_instance == null){GameObject go = new GameObject("DBManger");_instance = go.AddComponent<DBManager>();}return _instance;}}//用于建立数据库连接,保证数据流SqliteConnection connection;//数据库命令SqliteCommand command;//数据库阅读器SqliteDataReader reader;private const string dbName = "data";void Awake(){InitDB();OpenDB();}void OnDestroy(){CloseDB();}//拷贝数据库到沙盒目录void InitDB(){Debug.Log("*-> DBManager->Init");//判断是移动端if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer){string systemDBPath = Application.persistentDataPath + "/data.db";// copy data.db from steamingAssetsPath to persistentDataPathif (!System.IO.File.Exists(systemDBPath)){CopyFileFromStreamingAssetsToPersistentDataPath("/data.db");}}}void CopyFileFromStreamingAssetsToPersistentDataPath(string relativePath){string fileInStreamingAssets = Application.streamingAssetsPath + relativePath;string fileInPersistentDataPath = Application.persistentDataPath + relativePath;Debug.Log(fileInStreamingAssets + "->"+ fileInPersistentDataPath);if (Application.platform == RuntimePlatform.Android){WWW fileReader = new WWW(fileInStreamingAssets);while (!fileReader.isDone) { }//把www加载的数据库的bytes写入到沙盒的data.dbFileUtil.WriteFile(fileInPersistentDataPath, fileReader.bytes);}else{byte[] content = FileUtil.ReadFile(fileInStreamingAssets);FileUtil.WriteFile(fileInPersistentDataPath, content);}}public void OpenDB(){try{//指定数据库路径,一般放置到StreamingAsset下string path = Application.streamingAssetsPath + "/" + dbName + ".db";if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer){path = Application.persistentDataPath + "/" + dbName + ".db";}Debug.Log("dbPath:" + path);//新建数据库连接connection = new SqliteConnection(@"Data Source = " + path);//打开数据库connection.Open();Debug.Log("打开数据库");}catch (Exception ex){Debug.Log(ex.ToString());}}public void CloseDB(){if(connection!=null)connection.Close();if (command != null)command.Dispose();//Dispose用于释放,和Close功能一样if (reader != null)reader.Close();Debug.Log("关闭数据库");}//创建表//Activator.CreateInstance(type);//根据System.Type类型去实例化一个类//var fields = type.GetFields();//根据System.Type类型拿到类中的字段//fields[i].Name//得到单个字段的名字//fields[i].Name//T t:  type.GetField(fields[i].Name).GetValue(t);//得到T类型的t中field的值//fields[i].Name//T t:  type.GetField(fields[i].Name).SetValue(t,"新的值");//设置T类型的t中field的值public void CreateTable<T>(){var type = typeof(T);string sql = "create Table "+type.Name+"(";var fields = type.GetFields();for (int i = 0; i < fields.Length; i++){sql += "[" + fields[i].Name + "] " + CS2DB(fields[i].FieldType)+",";}sql = sql.TrimEnd(',') + ")";Excute(sql);}public void Insert<T>(T t){var type = typeof(T);string sql = "insert into " + type.Name + " values (";var fields = type.GetFields();foreach (var field in fields){//通过反射得到对象中的值sql += "'" + type.GetField(field.Name).GetValue(t) + "',";}sql = sql.TrimEnd(',') + ");";Excute(sql);}//插入语句//--insert into users values("小新",28,'男','371452646566256456',1235123123);public void InsertInto(string tbName,params object[] objs){string sql = "insert into " + tbName + " values (";foreach (var item in objs){sql += "'"+ item + "',";}//sql=sql.Substring(0, sql.Length - 1);sql=sql.TrimEnd(',')+ ");";Excute(sql);}//删除语句public void DeleteAnd(string tbName,params object[] objs){string sql = "delete from " + tbName + " where (";for (int i = 0; i < objs.Length-1; i+=2){sql += objs[i] + "='" + objs[i + 1] +"' and ";}sql=sql.Substring(0, sql.Length - 4)+ ");";Excute(sql);}//修改语句//--update users set age = 18 where name = '小史'and cardid isnull;public void UpdateAnd(string tbName, object[] colums,params object[] conditions){string sql = "update "+tbName+" set ";for (int i = 0; i < colums.Length-1; i+=2){sql += colums[i] + "='" + colums[i + 1] + "',";}sql = sql.TrimEnd(',') + " where (";for (int i = 0; i < conditions.Length-1; i+=2){sql += conditions[i] + "='" + conditions[i + 1]+"' and ";}sql = sql.Substring(0, sql.Length - 4) + ");";Excute(sql);}//查询>字典public List<Dictionary<string, string>> Select(string tbName){string sql = "select * from " + tbName;Excute(sql);List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();while(reader.Read()){var dic = new Dictionary<string, string>();for (int i = 0; i < reader.FieldCount; i++){dic.Add(reader.GetName(i), reader.GetValue(i).ToString());}result.Add(dic);}return result;}/// <summary>/// 泛型约束/// class :引用类型/// struct:值类型/// 接口和抽象类/// 普通类/// new():无参构造,(必须是最后一个约束)/// </summary>//查询:泛型实体类(复用性高,灵活)public List<T> Select<T>() where T: new(){var type = typeof(T);string sql = "select * from " + type.Name;Excute(sql);List<T> result = new List<T>();var fields = type.GetFields();while (reader.Read())//读取下一行数据{T t = new T();//使用new() 实例化Tfor (int i = 0; i < reader.FieldCount; i++){string key = reader.GetName(i);//获取数据库指定列的keyobject value = reader.GetValue(i);//获取数据库指定列的值Debug.Log(key + ":" + value);type.GetField(key).SetValue(t, value);//使用反射给T类型t赋值}result.Add(t);}return result;}/// <summary>/// 通过Id查询数据/// </summary>public T SelectById<T>(string id) where T:new(){Type type = typeof(T);string sql = "select * from " + type.Name + " where id='" + id+"'";Excute(sql);T t = new T();reader.Read();var count = reader.FieldCount;for (int i = 0; i < count; i++){string key = reader.GetName(i);object value = reader.GetValue(i);type.GetField(key).SetValue(t, value);}return t;}void Excute(string sql){Debug.LogWarning(sql);//创建数据库连接命令command = connection.CreateCommand();//设置命令语句command.CommandText = sql;//执行命令reader = command.ExecuteReader();}string CS2DB(Type type){string result = "Text";if(type==typeof(Int32)){result = "Int";}else if (type == typeof(String)){result = "Text";}else if (type == typeof(Single)){result = "FLOAT";}else if (type == typeof(Boolean)){result = "Bool";}return result;

更多unity2018的功能介绍请到paws3d爪爪学院查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213

近期更有资深开发人士直播分享unity开发经验,详情请进入官网或加入QQ群了解

Unity3D高级-Sqlite相关推荐

  1. Unity3D之SQLite的使用

    原创作者:秦元培 文章出处:http://blog.csdn.net/qinyuanpei/article/details/46812655#comments 转载过来方便查看.文章末尾有我自己总结的 ...

  2. Unity3D高级动画(Animator)-动画状态机

    动态系统种类: Animation动画状态机:是旧版的动画状态机 Animator动画状态机:是新版的动画状态机,其实就是由Animation组成的(这里我们常用这个) Animator的使用: (1 ...

  3. Unity3d 周分享(17期 2019.5.18 )

    选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧 1. [Unity]介绍可以在游戏画面上显示FPS,内存,音频,设备信息的" ...

  4. 【unity3d】如何学习unity3d

    Unity3D是一个跨平台的游戏引擎,它提供了3d游戏的大部分基础功能实现,比如物理碰撞.3d模型显示.光照等功能,简化了使用者开发游戏的过程,更能够节省非常多的成本,unity3d与别的游戏引擎最大 ...

  5. 2019年4月份整理的Unity3D 20个实用插件-免费下载

    Unity3D 简易细节层次插件 Simple LOD http://www.idoubi.net/unity3d/tool/3764.html Unity3D 物体表面贴花喷漆插件 Easy Dec ...

  6. 【转】U3D手游《苍穹变》性能优化经验谈

    4月11日,由unity公司举办的Unite 2016大会在上海正式举行,在4月12日的案例分享专场会议上,天神互动U3D高级开发工程师康凯以手游<苍穹变>为例讲述了3DMMOARPG游戏 ...

  7. 程序员怎样上元宇宙的车?

    导读:游戏程序员的快速学习之路,从这4步开始. 作者:罗培羽 来源:大数据DT(ID:hzdashuju) 不管你是否看好,元宇宙在2021年确实是火了.在这个宏大的概念中,目前最接近落地成为现实的, ...

  8. 85后独立手游开发者专访:为游戏而坚持

    追逐梦想的过程是快乐的,但也要付出很多努力.个中滋味,唯有自己清楚. 朱羽是一个典型的85后大男孩,闲暇时间喜欢跟朋友一起聊天,唱歌,旅游,打篮球,同时也关注一些新的技术动态,认真.坚持是他的信条. ...

  9. 游戏开发学习路线图(2023最新版)建议收藏

    游戏开发是一个高度技术化的领域,需要掌握编程语言和编程技能.你可以从学习基本的编程概念和语法开始,如C++.C#.Python等常用的游戏编程语言.掌握编程的基础知识是游戏开发的基石.很多小伙伴不知道 ...

最新文章

  1. 【从零学习OpenCV 4】Mat类介绍
  2. java怎么将加载图片消除_Java中加载图片的方法
  3. DockerCompose-初始Compose
  4. 通过jconsole监控tomcat JVM 内存、线程、CPU
  5. whea uncorrectable error蓝屏_Windows 10再出“不可选”更新:蓝屏、死机比较烦
  6. Exynos4412 内核移植(四)—— MMU 相关知识解析
  7. MFC初探 —— Editcontrol实现多行显示
  8. Ps 初学者教程,如何在图片中创建新背景?
  9. Struts2-03-拦截器(BOS物流项目用户登录拦截)
  10. 基于SURF算法的图像拼接方法
  11. 捷径 iOS12.1 基础功能 参数输出
  12. 手机查看云服务器文件夹,手机查看云服务器文件夹
  13. 服务器raid0系统坏了,服务器磁盘阵列raid1、raid0、raid5故障时的数据恢复思路和方法...
  14. WEB开发(2) Servlet
  15. 推荐几款主流好用的远程终端连接管理软件
  16. BrowserSync 本地服务器的起用
  17. 为什么有些应用程序愿意采用不可靠的UDP,而不愿意采用可靠的TCP?试解释为什么ARP高速缓存每存入一个项目就要设置10~20分钟的超时计时器。这个时间设置的太大或太小会出现什么问题?
  18. 【已解决】error: conflicting declaration ‘typedef struct LZ4_stream_t LZ4_stream_t’ typedef struct { long
  19. java读取 png_JAVA如何操作PNG图片
  20. JavaScript中的参数传递

热门文章

  1. VB里的 dim是什么意思?
  2. 荣耀机试题 2021.04 ~05
  3. 基于C++的俄罗斯方块游戏的开发与设计
  4. 2198: 小P当志愿者送餐
  5. insmod: error inserting ‘./module1.ko‘: -1 Unknown symbol in module
  6. Android移动开发问题 AAPT: error: resource xml/11 (aka com.example.myapplication:xml/11) not found.
  7. c语言mn间有多少素数,素数表达式p=2a+1 (a ≠ 2mn+m+n)由此出发看哥猜、挛猜比较清晰...
  8. MarkDown超级教程 Obsidian版_11.4
  9. 爱奇艺视频qsv转换flv格式方法教程
  10. 3.0时代,公关传播在人文营销中的应用