unity3d sqlite数据库的读写方法
首先,我们要从unity的安装路径中复制mono.data.sqlite.dll和sqlite3.dll两个动态链接库到untiy的plugins目录下,如下图所示:
使用navicat for sqlite创建一个sqlite数据库文件,放到Resources文件夹目录中,如下图所示:
新建一个DbAccess脚步,添加以下脚步:
using UnityEngine;
using System;
using System.Collections;
using Mono.Data.Sqlite;
using System.IO;
public class DbAccess {
private SqliteConnection dbConnection;//sql连接
private SqliteCommand dbCommand=null;//sql命令
private SqliteDataReader dbReader;//sql读取器
public DbAccess(string connectionString)
{
string appDBPath = "";
if(Application.platform == RuntimePlatform.WindowsEditor)//如果是windows编辑器中
{
appDBPath = Application.dataPath+"//"+connectionString;
}
else if(Application.platform == RuntimePlatform.Android)--如果是安卓平台
{
appDBPath = Application.persistentDataPath +"/" + connectionString;
if (!File.Exists(appDBPath))
{
WWW loader = new WWW("jar:file://" + Application.dataPath + "/" + connectionString);//把数据库复制到安卓可写路径中,注:sqlite不能在安装包中读取数据
File.WriteAllBytes(appDBPath,loader.bytes);
}
}
OpenDB("Data Source="+appDBPath);
}
private void OpenDB(string connectionString)
{
try
{
dbConnection = new SqliteConnection(connectionString);
dbConnection.Open();
Debug.Log("connect to db");
}
catch (System.Exception ex)
{
Debug.Log(ex.Message);
}
}
public void CloseSqlConnection()//关闭数据库连接
{
if (dbCommand!=null)
dbCommand.Dispose();
dbCommand = null;
if (dbReader!=null)
dbReader.Dispose();
dbReader = null;
if (dbConnection!=null)
dbConnection.Close();
dbConnection = null;
}
public SqliteDataReader ExecuteQuery(string sqlQuery)//执行查询
{
dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = sqlQuery;
dbReader = dbCommand.ExecuteReader();
return dbReader;
}
public SqliteDataReader ReadFullTable(string tableName)//读取整个表
{
string query = "SELECT * FROM " + tableName+";";
return ExecuteQuery(query);
}
public SqliteDataReader InsertInto(string tableName,string[] values)//在表中插入数据
{
string query = "INSERT INTO " + tableName + " VALUES('" + values[0];
for (int i = 1; i < values.Length;i++ )
{
query += "','" + values[i];
}
query += "')";
return ExecuteQuery(query);
}
public SqliteDataReader UpdateInto(string tableName,string[] cols,string colsValues,string selectKey,string selectValue)//替换表中数据
{
string query = "UPDATE " + tableName + " SET " + cols[0] + " = " + colsValues[0];
for (int i = 1; i < colsValues.Length; ++i)
{
query += ", " + cols[i] + " =" + colsValues[i];
}
query += " WHERE " + selectKey + " = " + selectValue + " ";
return ExecuteQuery(query);
}
public SqliteDataReader Delete(string tableName, string[] cols, string[] colsvalues)//删除表中数据
{
string query = "DELETE FROM " + tableName + " WHERE " + cols[0] + " = " + colsvalues[0];
for (int i = 1; i < colsvalues.Length; ++i)
{
query += " or " + cols[i] + " = " + colsvalues[i];
}
return ExecuteQuery(query);
}
public SqliteDataReader InsertIntoSpecific (string tableName, string[] cols, string[] values)//插入特定值
{
if (cols.Length != values.Length) {
throw new SqliteException ("columns.Length != values.Length");
}
string query = "INSERT INTO " + tableName + "(" + cols[0];
for (int i = 1; i < cols.Length; ++i) {
query += ", " + cols[i];
}
query += ") VALUES (" + values[0];
for (int i = 1; i < values.Length; ++i) {
query += ", " + values[i];
}
query += ")";
return ExecuteQuery (query);
}
public SqliteDataReader DeleteContents (string tableName)//删除表
{
string query = "DELETE FROM " + tableName;
return ExecuteQuery (query);
}
public SqliteDataReader CreateTable (string name, string[] col, string[] colType)//创建表
{
if (col.Length != colType.Length) {
throw new SqliteException ("columns.Length != colType.Length");
}
string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0];
for (int i = 1; i < col.Length; ++i) {
query += ", " + col[i] + " " + colType[i];
}
query += ")";
return ExecuteQuery (query);
}
public SqliteDataReader SelectWhere (string tableName, string[] items, string[] col, string[] operation, string[] values)//集成所有操作后执行
{
if (col.Length != operation.Length || operation.Length != values.Length) {
throw new SqliteException ("col.Length != operation.Length != values.Length");
}
string query = "SELECT " + items[0];
for (int i = 1; i < items.Length; ++i) {
query += ", " + items[i];
}
query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' ";
for (int i = 1; i < col.Length; ++i) {
query += " AND " + col[i] + operation[i] + "'" + values[0] + "' ";
}
return ExecuteQuery (query);
}
}
使用事例:
数据库的Dialog表中有一下数据:
DbAccess db = new DbAccess("/Resources/DazzleParkour.sqlite");
using (SqliteDataReader reader = db.SelectWhere("Dialog", new string[] { "id,Name,FileName,Scale" }, new string[] { "Scale" }, new string[] { "=" }, new string[] { "1" }))//读取出Scale等于1的数据
{
while (reader.Read())// 循环遍历数据
{
int name = reader.GetInt32(reader.GetOrdinal("id"));
Debug.Log(name);
}
reader.Close();
db.CloseSqlConnection();
}
最后打印的数据如下
在打包时,注意要把playersetting里的api解析等级改为.Net 2.0
unity3d sqlite数据库的读写方法的更多相关文章
- 基于三层架构下的公共数据访问方法(Sqlite数据库)
作者总结了一下,使用Winform的三层架构做窗体应用程序,在数据访问方面,有用到纯sql语句方法.参数方法.存储过程方法. 那么什么是三层架构呢? UI---存放Form窗体---(用户所关心的) ...
- ASP.net与SQLite数据库通过js和ashx交互(连接和操作)
ASP.net与SQLite数据库通过js和ashx交互(连接和操作): 废话(也是思路):用的是VS2010,打算做网站前后台.由于不喜欢前台语言里加些与html和css和js的其他内容,想实现前后 ...
- 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...
- android中与SQLite数据库相关的类
为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...
- 讨论SQLite数据库损坏与修复
版权声明:博客将逐步迁移到 http://cwqqq.com https://blog.csdn.net/cwqcwk1/article/details/45541409 昨晚,朋友和我反馈SQL ...
- Sqlite 数据库出现database disk image is malformed报错的解决方法
软件用的是Sqlite数据库,昨天还好好的,今天开机登录软件报错:database disk image is malformed 用Sqlite Expert Personal 重建索引,发现其中一 ...
- VS中引用第三方库的方法(配置sqlite数据库)
我们在编写程序时,,不可避免的会使用第三方的库文件,很少使用源文件(.cpp),大部分是使用对类进行声明的头文件和封装了类的链接库(静态lib或动态dll),比如我们写程序用的iostream这个库, ...
- C#连接SQLite数据库方法
--结合Enterprise Library连接,操作SQLite 企业库是我们常用的框架之一,可以从http://entlib.codeplex.com/下载Enterprise Library 5 ...
- 使用安卓读取sqlite数据库方法记录
最近要实现android读取sqlite数据库文件,在这里先做一个英汉字典的例子.主要是输入英语到数据库中查询相应的汉语意思,将其答案输出.数据库采用sqlite3. 如图: 实现过程完全是按照参考文 ...
随机推荐
- Netty源码分析(七):初识ChannelPipeline
ChannelPipeline单看名称就可以知道Channel的管道.本篇将结合它的默认实现类DefaultChannelPipeline来对它做一个简单的介绍. 示例图 上图是官方提供的Channe ...
- Docker学习:Docker安装和基本使用
Docker Docek是一种容器技术.容器是一种轻量级.可移植.自打包的软件技术,使应用程序可以在几乎任何地方以相同的方式运行. 使用者可以在笔记本上创建并测试好的容器,无需任何修改就能够在生产系统 ...
- CC01:确定字符互异
题目 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,Fal ...
- Python面向对象之单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某 一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就 能派上用场. 单例 ...
- Codeforces Round #431 (Div. 2) B
Connect the countless points with lines, till we reach the faraway yonder. There are n points on a c ...
- ASP.NET Core 2.0 源代码
ASP.NET Core 2.0 源代码 在Visual Studio 2017中可以通过符号以及源链接,非常方便对 ASP.NET Core 2.0中源代码进行调试.在这篇文章中,我们将重点介绍如何 ...
- 机器学习框架ML.NET学习笔记【5】多元分类之手写数字识别(续)
一.概述 上一篇文章我们利用ML.NET的多元分类算法实现了一个手写数字识别的例子,这个例子存在一个问题,就是输入的数据是预处理过的,很不直观,这次我们要直接通过图片来进行学习和判断.思路很简单,就是 ...
- SQL SERVER 同一个表并且是同一个时间字段进行相减
表AID NUM TIEM1 10 2012-06-10 10:10:002 20 2012-06-10 20:10:003 20 2012-06-10 20:10:004 10 2012-06-10 ...
- 3.Freshman阶段学习内容的确定
我刷知乎.在知乎上答题的程序员,不是很牛逼就是更牛逼,说起各种系统.各种系统的各种版本.各种语言.数据库.算法.IT届的各种圣战都有板有眼.信手拈来.头头是道,不得不服.这导致了一些非常严重的问题:我 ...
- JAVA基础之Map接口
个人理解: 个人感觉Map接口以后会经常用到,可以很清晰地查找某个对象,要熟悉其四种遍历方法.特别注意其键值对的键不能是重复的,有想定义有序存取的话,可以使用LinkedHashMap集合.不过定义自 ...