Unity3D与Sqlite数据库直连
网址:http://bbs.9ria.com/forum.php?mod=viewthreadtid=168629fromuid=308561 这几天也顺便研究了下Unity3D 如何与 Sqlite 数据库进行直连的问题。不废话了,直接介绍吧。原文来自于: http://wiki.unity3d.com/index.php/Sqlite ,大家可以去学习下。 1、
网址:http://bbs.9ria.com/forum.php?mod=viewthread&tid=168629&fromuid=308561
这几天也顺便研究了下Unity3D如何与Sqlite数据库进行直连的问题。不废话了,直接介绍吧。原文来自于:http://wiki.unity3d.com/index.php/Sqlite,大家可以去学习下。
1、环境介绍:
Windows7,Unity3D,SQLite Expert Personal 3
2、开发语言:
JavaScript
3、需要的dll文件:
Mono.Data.Sqlite.dll和sqlite3.dll,稍后我会将所有文件打包在一起供大家讨论下,先看下这些dll文件应该被放在哪里,看下面的截图:
,一定要在这个目录下,请跟我保持一致。
4、如果需要将编译好的程序发布成功的话,需要改一些地方,具体见下面的截图:
5、下面来看下代码吧,先看下如何创建数据库的代码,这一篇代码是不用挂到任何对象上面去的,你只用把它当成一个工具即可。如下所示:
/* Javascript class for accessing SQLite objects.
To use it, you need to make sure you COPY Mono.Data.SQLiteClient.dll from wherever it lives in your Unity directory
to your project's Assets folder
Originally created by dklompmaker in 2009
http://forum.unity3d.com/threads ... sier-Database-Stuff
Modified 2011 by Alan Chatham */
//#pragma strict
/*代码描述
*本代码是为了在Windows环境下运行unity3d和Sqlite数据库而写的;实现的基本功能是unity3d能够与数据库之间进行基本的通信,比如说
在数据库中的数据被改变了以后,unity3d中得到的数据也会在刷新了之后跟着改变;这只是一个基本的核心的技术,为的是能够应用在大型的unity3d
项目中,能够存储场景中的项目的属性,在需要改变对象的属性或增加、减少等对象时能够很方便的用得上。
要实现本代码。首先需要一些dll文件,一个是Mono.Data.SQLiteClient.dll,另外一个是sqlite3.dll,这些文件都能够在unity3d的安装目录中找得到。
除此之外,还需要把这两个文件放在你的项目的这个路径下面:\Assets\Plugins\,没有Plugins文件夹就必须创建这个文件夹,然后将这两个dll文件放在该文件夹写。
当然,如果你想能够在PC上面发布成可执行文件,还需要改动一些地方。在unity3d中的Play Setting ->Other Setting 中将Api Compatibility的等级改为
.NET 2.0;那么这些操作做完了以后,如果你的代码写得没有问题,那么你就可以成功了。
好了,下面咱们来详细解释下代码吧。
-
*
-
*/
-
import System.Data; // we import our data class 我们先导入我们的数据集
-
import Mono.Data.Sqlite; // we import sqlite 我们导入sqlite数据集,也就是Plugins文件夹下的那个dll文件
-
-
class dbAccess {
-
// variables for basic query access
-
private var connection : String; //数据库的连接字符串,用于建立与特定数据源的连接
-
private var dbcon : IDbConnection; //IDbConnection的连接对象,其实就是一个类对象
-
private var dbcmd : IDbCommand; //IDbCommand类对象,用来实现操作数据库的命令:注解:我在网上资料看到的如何实现对数据库执行命令:
-
//首先创建一个IDbConnection连接对象,然后将一条数据库命令赋值给一个字符串,利用这个字符串和连接对象
-
//就可以创建(new)一个IDbCommand对象了,然后使用提供的方法就可以执行这个命令了。
-
private var reader : IDataReader; //reader的作用就是读取结果集的一个或多个只进结果流
-
-
function OpenDB(p : String){
-
connection = "URI=file:" + p; // we set the connection to our database
-
dbcon = new SqliteConnection(connection);
-
dbcon.Open(); //打开数据库连接操作
-
}
-
-
function BasicQuery(q : String, r : boolean){ // run a baic Sqlite query
-
dbcmd = dbcon.CreateCommand(); // create empty command
-
dbcmd.CommandText = q; // fill the command
-
reader = dbcmd.ExecuteReader(); // execute command which returns a reader 返回IDataReader的对象,创建IDataReader的对象
-
if(r){ // if we want to return the reader
-
return reader; // return the reader 返回读取的对象,就是读到了什么东西
-
}
-
}
-
-
// This returns a 2 dimensional ArrayList with all the
-
// data from the table requested
-
function ReadFullTable(tableName : String){
-
var query : String;
-
query = "SELECT * FROM " + tableName;
-
dbcmd = dbcon.CreateCommand();
-
dbcmd.CommandText = query;
-
reader = dbcmd.ExecuteReader();
-
var readArray = new ArrayList();
-
while(reader.Read()){
-
var lineArray = new ArrayList();
- for (var i = 0; i
-
lineArray.Add(reader.GetValue(i)); // This reads the entries in a row
-
readArray.Add(lineArray); // This makes an array of all the rows
-
}
-
return readArray; // return matches
-
}
-
-
// This function deletes all the data in the given table. Forever. WATCH OUT! Use sparingly, if at all
-
function DeleteTableContents(tableName : String){
-
var query : String;
-
query = "DELETE FROM " + tableName;
-
dbcmd = dbcon.CreateCommand();
-
dbcmd.CommandText = query;
-
reader = dbcmd.ExecuteReader();
-
}
-
-
function CreateTable(name : String, col : Array, colType : Array){ // Create a table, name, column array, column type array
-
var query : String;
-
query = "CREATE TABLE " + name + "(" + col[0] + " " + colType[0];
-
for(var i=1; i
-
query += ", " + col + " " + colType;
-
}
-
query += ")";
-
dbcmd = dbcon.CreateCommand(); // create empty command
-
dbcmd.CommandText = query; // fill the command
-
reader = dbcmd.ExecuteReader(); // execute command which returns a reader
-
}
-
function InsertIntoSingle(tableName : String, colName : String, value : String){ // single insert
-
var query : String;
-
query = "INSERT INTO " + tableName + "(" + colName + ") " + "VALUES (" + value + ")";
-
dbcmd = dbcon.CreateCommand(); // create empty command
-
dbcmd.CommandText = query; // fill the command
-
reader = dbcmd.ExecuteReader(); // execute command which returns a reader
-
}
-
function InsertIntoSpecific(tableName : String, col : Array, values : Array){ // Specific insert with col and values
-
var query : String;
-
query = "INSERT INTO " + tableName + "(" + col[0];
-
for(var i=1; i
-
query += ", " + col;
-
}
-
query += ") VALUES (" + values[0];
-
for(i=1; i
-
query += ", " + values;
-
}
-
query += ")";
-
dbcmd = dbcon.CreateCommand();
-
dbcmd.CommandText = query;
-
reader = dbcmd.ExecuteReader();
-
}
-
-
function InsertInto(tableName : String, values : Array){ // basic Insert with just values
-
var query : String;
-
query = "INSERT INTO " + tableName + " VALUES (" + values[0];
-
for(var i=1; i
-
query += ", " + values;
-
}
-
query += ")";
-
dbcmd = dbcon.CreateCommand();
-
dbcmd.CommandText = query;
-
reader = dbcmd.ExecuteReader();
-
}
-
-
// This function reads a single column
-
// wCol is the WHERE column, wPar is the operator you want to use to compare with,
-
// and wValue is the value you want to compare against.
-
// Ex. - SingleSelectWhere("puppies", "breed", "earType", "=", "floppy")
-
// returns an array of matches from the command: SELECT breed FROM puppies WHERE earType = floppy;
-
function SingleSelectWhere(tableName : String, itemToSelect : String, wCol : String, wPar : String, wValue : String){ // Selects a single Item
-
var query : String;
-
query = "SELECT " + itemToSelect + " FROM " + tableName + " WHERE " + wCol + wPar + wValue;
-
dbcmd = dbcon.CreateCommand();
-
dbcmd.CommandText = query;
-
reader = dbcmd.ExecuteReader();
-
var readArray = new Array();
-
while(reader.Read()){
-
readArray.Push(reader.GetString(0)); // Fill array with all matches
-
}
-
return readArray; // return matches
-
}
-
-
-
function CloseDB(){
-
reader.Close(); // clean everything up
-
reader = null;
-
dbcmd.Dispose();
-
dbcmd = null;
-
dbcon.Close();
-
dbcon = null;
-
}
-
- }
上述代码的基本的增删改查什么的都具有了,仔细看看然后加上我的注释,这段代码也不难,就是可能初学的话有点难以接受,说实话我也是初学,如果没有原文,我是绝对写不出来这个的。。。
7、好了,下面我们再来看看如何在Unity3D中使用这个数据库的代码吧:
-
//#pragma strict
-
/* Script for testing out SQLite in Javascript
-
2011 - Alan Chatham
-
Released into the public domain
-
-
This script is a GUI script - attach it to your main camera.
-
It creates/opens a SQLite database, and with the GUI you can read and write to it.
-
*/
-
-
// This is the file path of the database file we want to use
-
// Right now, it'll load TestDB.sqdb in the project's root folder.
-
// If one doesn't exist, it will be automatically created.
-
public var DatabaseName : String = "TestDB.sqdb";
-
-
// This is the name of the table we want to use
-
public var TableName : String = "TestTable";
-
var db : dbAccess;
-
-
function Start(){
-
// Give ourselves a dbAccess object to work with, and open it
-
-
-
-
db = new dbAccess();
-
db.OpenDB(DatabaseName);
-
// Let's make sure we've got a table to work with as well!
-
var tableName = TableName;
-
var columnNames = new Array("firstName","lastName");
-
var columnValues = new Array("text","text");
-
try {db.CreateTable(tableName,columnNames,columnValues);
-
}
-
catch(e){// Do nothing - our table was already created判断表是否被创建了
-
//- we don't care about the error, we just don't want to see it
-
}
-
}
-
-
// These variables just hold info to display in our GUI
-
var firstName : String = "First Name";
-
var lastName : String = "Last Name";
-
var DatabaseEntryStringWidth = 100;
-
var scrollPosition : Vector2;
-
var databaseData : ArrayList = new ArrayList();
-
-
// This GUI provides us with a way to enter data into our database
-
// as well as a way to view it
-
function OnGUI(){
-
GUI.Box(Rect (25,25,Screen.width - 50, Screen.height - 50),"Data");
-
GUILayout.BeginArea(Rect(50, 50, Screen.width - 100, Screen.height - 100));
-
// This first block allows us to enter new entries into our table
-
GUILayout.BeginHorizontal();
-
firstName = GUILayout.TextField(firstName, GUILayout.Width (DatabaseEntryStringWidth));
-
lastName = GUILayout.TextField(lastName, GUILayout.Width (DatabaseEntryStringWidth));
-
-
//lastName = GUILayout.TextField();
-
GUILayout.EndHorizontal();
-
-
if (GUILayout.Button("Add to database")){
-
// Insert the data
-
InsertRow(firstName,lastName);
-
// And update the readout of the database
-
databaseData = ReadFullTable();
-
}
-
// This second block gives us a button that will display/refresh the contents of our database
-
GUILayout.BeginHorizontal();
-
if (GUILayout.Button ("Read Database"))
-
databaseData = ReadFullTable();
-
if (GUILayout.Button("Clear"))
-
databaseData.Clear();
-
GUILayout.EndHorizontal();
-
-
GUILayout.Label("Database Contents");
-
scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Height(100));
-
for (var line : ArrayList in databaseData){
-
GUILayout.BeginHorizontal();
-
for (var s in line){
-
GUILayout.Label(s.ToString(), GUILayout.Width(DatabaseEntryStringWidth));
-
}
-
GUILayout.EndHorizontal();
-
}
-
-
GUILayout.EndScrollView();
-
if (GUILayout.Button("Delete All Data")){
Unity3D与Sqlite数据库直连.rar (168.27 KB, 下载次数: 239)
-
-
-
Unity3D与Sqlite数据库直连.rar (446.06 KB, 下载次数: 584)
-
-
-
-
-
-
DeleteTableContents();
-
databaseData = ReadFullTable();
-
}
-
GUILayout.EndArea();
-
}
-
-
// Wrapper function for inserting our specific entries into our specific database and table for this file
-
function InsertRow(firstName, lastName){
-
var values = new Array(("'"+firstName+"'"),("'"+lastName+"'"));
-
db.InsertInto(TableName, values);
-
}
-
-
// Wrapper function, so we only mess with our table.
-
function ReadFullTable(){
-
return db.ReadFullTable(TableName);
-
}
-
-
// Another wrapper function...
-
function DeleteTableContents(){
-
db.DeleteTableContents(TableName);
- }
这一段代码是要你挂在你的主摄像机上面的,其实我对数据库方面的知识很浅陋,很多地方还不是很理解,希望有高人能够将这段代码进行详细的注释,以便能让我们这种菜鸟级别的能够充分吸收啊。。。
9、下面咱们再来看看我们的运行结果吧:
这是在Unity3D中运行的结果,我们试试对数据的操作会怎么样
我们看见了我们对数据的操作能够成功,经过测试,其他的Button也都能出现相对应的效果,那我们再看看这个到底有没有生成我们想要的数据库文件:
看看截图大家就知道了:
- 看见了没,我们成功了。经过测试,我们在对数据库中的数据进行操作的时候,我们的Unity3D中的数据也会发生相应的改变了,所以,这次我们成功了。在这里我们要感谢原文的支持哈。希望路过的高手勿喷哈。。。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

如何在C++中实现HTTP流传输?使用Boost.Asio和asiohttps客户端库创建SSL流套接字。连接到服务器并发送HTTP请求。接收HTTP响应头并打印它们。接收HTTP响应正文并打印它。

可以通过使用gjson库或json.Unmarshal函数将JSON数据保存到MySQL数据库中。gjson库提供了方便的方法来解析JSON字段,而json.Unmarshal函数需要一个目标类型指针来解组JSON数据。这两种方法都需要准备SQL语句和执行插入操作来将数据持久化到数据库中。

在Golang中使用数据库回调函数可以实现:在指定数据库操作完成后执行自定义代码。通过单独的函数添加自定义行为,无需编写额外代码。回调函数可用于插入、更新、删除和查询操作。必须使用sql.Exec、sql.QueryRow或sql.Query函数才能使用回调函数。

通过Go标准库database/sql包,可以连接到MySQL、PostgreSQL或SQLite等远程数据库:创建包含数据库连接信息的连接字符串。使用sql.Open()函数打开数据库连接。执行SQL查询和插入操作等数据库操作。使用defer关闭数据库连接以释放资源。

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。
