unity3d,C#使用sqlite作为数据库解决方案思路

1,编辑器建立好数据库结构,生成sqlite数据库文件,可以用navicat图形界面编辑器来操作。

2,建立好的数据库,后缀名变为.txt格式(方便unity3d加载),放文件放到Assest/Resources目录下(新建目录)。

放在Resources目录下的文件,在Pc/ios/android端均可以不作区分的用Resource来加载,假设数据库文件名位:data.txt,语句如下:

TextAsset txt = Resources.Load ("data", typeof(TextAsset))as TextAsset;

3, 将读取到的TextAsset文件写入对应平台的沙盒路径下, 代码为:

databaseFilePath = Application.persistentDataPath+"//"+data.db;(沙盒,各平台路径不同,均为可读写)

File.WriteAllBytes(databaseFilePath,txt.bytes);

4,加载沙盒路径下的数据库文件进行读写操作。DbAccess封装了数据库操作。其中需要两个dll文件,一个so文件(android平台需要libsq

<p><span style="font-family: Arial, Helvetica, sans-serif;">
using UnityEngine;</span></p>
using System.Collections;
using Mono.Data.Sqlite;
using System;
using System.IO;

public class DbAccess{

	private SqliteConnection dbConnection;

	private SqliteCommand dbCommand;

	private SqliteDataReader reader;

	public DbAccess (string connectionString)
	{
		OpenDB (connectionString);
	}
	public DbAccess ()
	{

	}

	public void OpenDB (string connectionString)
	{
		try
		{
			dbConnection = new SqliteConnection (connectionString);

			dbConnection.Open ();

			Debug.Log ("Connected to db");
		}
		catch(Exception e)
		{
			string temp1 = e.ToString();
			Debug.Log(temp1);
		}
	}

	public void CloseSqlConnection ()
	{

		if (dbCommand != null) {

			dbCommand.Dispose ();

		}

		dbCommand = null;

		if (reader != null) {

			reader.Dispose ();

		}

		reader = null;

		if (dbConnection != null) {

			dbConnection.Close ();

		}

		dbConnection = null;

		Debug.Log ("Disconnected from db.");

	}

	public SqliteDataReader ExecuteQuery (string sqlQuery)

	{

		dbCommand = dbConnection.CreateCommand ();

		dbCommand.CommandText = sqlQuery;

		reader = dbCommand.ExecuteReader ();

		return reader;

	}

	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];
		}
		Debug.Log(query);
		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];

		}
		if (col.Length == 0) {
			query += " FROM " + tableName;
		} else
		{
			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);

	}
}

public class DataCenter{

	private string databaseFilename = "data.db";

	private string databaseFilePath;

	private DbAccess dbaccess;

	public DataCenter()
	{
		databaseFilePath = Application.persistentDataPath+"//"+databaseFilename;

		if (!File.Exists (databaseFilePath))
		{
			TextAsset txt = Resources.Load ("data", typeof(TextAsset))as TextAsset;

			File.WriteAllBytes(databaseFilePath,txt.bytes);

			//copy data file to sandbox
		}

		dbaccess = new DbAccess (@"Data Source=" + databaseFilePath);
	}
}

时间: 2024-08-02 21:09:04

unity3d,C#使用sqlite作为数据库解决方案思路的相关文章

Unity3D游戏开发之SQLite让数据库开发更简单

各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大家一起交流的内容是在Unity3D游戏开发中使用SQLite进行数据库开发.坦白来讲,在我的技术体系中Web和数据库是相对薄弱的两个部分.因此正好这段时间项目须要和server.数据库进行交互,因此在接下来的文章中博主可能会更加倾向于解说这方面的内容,希望大家能够喜欢啊! 一.什么是SQLite?

.net core加载加密的sqlite文件失败解决方案

.net core加载加密的sqlite文件失败解决方案 ??在项目开发过程中,遇到使用sqlite的场景.在加载加密的sqlite时,连接sqlite时报错,,先用百度查询了下资料,尚未找到对应解决方法,故接着在stackoverflow上查找,找到了解决思路,并已解决问题. 1.开发时所用到的相关内容 1.1相关项目组件 组件名称 版本 Microsoft.NETCore.App 2.1.0 sqlSugarCore 5.0.0.9 1.2 sqlite加密软件 软件名称 版本 SQLite

Sqlite嵌入式数据库的安装、建库、建表、更新表结构以及数据导入导出等等详细过程记录

简介: SQLite 是实现了SQL 92标准的一个大子集的嵌入式数据库.其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中而著名.我觉得SQLite的功能一定程度上居于MySQL 和PostgreSQL之间.尽管如此,在性能上面,SQLite常常快2-3倍 (甚至更多).这利益于其高度调整了的内部架构,因为它除去了服务器端到客户端和客户端到服务器端的通信. 而令人印象深刻的特点是你可将你的整个数据库系统放在其中.利用非常高效的内存组织,SQLite只需在很小的内存中维护其很小的

sqlite( 轻量级数据库)

sqlite(轻量级数据库) 1.为什么要使用数据库呢? 文件读写, NSUserDefualts, 归档, 写入的过程是覆盖, 效率比较低, 并且不支持针对某些数据的修改 2.数据库: 存放数据的仓库 数据库以表的形势存放数据 每个表都有字段, 用于标示存什么样的数据 在字段中, 有一种特殊的字段(主键), 主键数据是唯一, 不重复, 用于区分数据使用 3.常用的数据库: Oracle, SQLServer, access, sqlite(轻量级数据库, 体积小, 占用内存小, 能够满足基本的

QT SQLite 多数据库操作大全

QT SQLite 多数据库操作大全 一.单数据库模型 一般QT都是把打开一个缺省数据库连接,操作一个数据库连接,但是对Sqlite中频率修改容易加锁,因此有一种设计模式是把频率修改的表放在不同的数据库文件中,但这样要修改代码操作数据库部分 通常打开代码 http://developer.nokia.com/community/wiki/Creating_an_SQLite_database_in_Qt bool DatabaseManager::openDB() { // Find QSLit

sqlite嵌入式数据库C语言基本操作(2)

:first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px}iframe{border:0}figure{-webkit-margin-before:0;-webkit-margin-after:0;-webkit-margin-start:0;-webkit-margin-end:0}kbd{border:1px solid #aaa;-moz-bord

赵雅智_使用sqlite创建数据库

DatabaseHelper.java package com.example.android_sqlite.database; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelp

数据缓存——SQLite关系型数据库的使用

SQLite关系型数据库的使用 Demo下载地址 数据库(Database): 存放数据的仓库, 存放的是一张的表, 特别像Excel, Numbers, 都以表格的形式存放数据, 可以创建多张表. 常见的数据库: sqlite, MySQL, SQLServer, Oracle, Access. 使用数据库,主要是因为文件读写和归档读取数据需要一次把数据全部读出来, 占用内存开销大:其次是数据库数据效率高, 体现在增删改查. 数据库存储数据的步骤 1.新建一个数据库 2.新建一张表(table

SQLite创建数据库失败

1.现象:.创建不出来数据库, 解决:测试用的项目包明以db结尾了,重新创建项目改成dbtest就没事了. 2.现象;创建出来数据库,但是数据库中没有表项 解决: db.execSQL("create table " + TABLE_NEWS_NAME + " ( " + TABLE_NEWS_ID + " integer primary key autoincrement, " + TABLE_NEWS_TITLE + " varch