您的位置:首页 > 移动开发 > Unity3D

Unity在android平台下使用sqlite数据库

2016-09-06 11:19 483 查看
在android下使用sqlite数据库,需要找到在..\Unity\Editor\Data\MonoBleedingEdge\lib\mono目录下选择一个.net版本下(推荐2.0版本)的System.Data.dll与Mono.Data.Sqlite.dll两个文件。
在新建的unity工程中Assests目录下建立Plugins文件夹与StreamingAssets文件夹(因为使用代码创建的数据库应该放在StreamingAsset下),将找到的两个dll文件放入Plugins文件下。
接着进入https://www.sqlite.org/download.html(sqlite官网)。在Precompiled Binaries
for Windows下下载对应系统位数的sqlite3.dll文件,同样放入Plugins文件夹下。



在Plugins目录下新建一个Android文件夹,下载libsqlite3.so到Assets-Plugins-Android下面,这里的libsqlite3.so文件是sqlite3.dll在Linux环境下编译产生的文件(下载链接:http://pan.baidu.com/s/1bplz66z 密码:rse4).
创建一个SqliteDbManager类(主要目的是对数据库进行连接关闭以及进行增删改查的操作,在这测试代码上我写了几个很简单的操作)
using UnityEngine;
using System.Collections;
using Mono.Data.Sqlite;
using System;
using System.Data;

public class SqliteDbManager
{
// 连接对象
private SqliteConnection dbConnection;
// 数据库操作命令
private SqliteCommand dbCommand;
// 声明一个读取结果集的一个或多个结果流
private SqliteDataReader reader;

// 数据库的连接字符串,用于建立与特定数据源的连接
public SqliteDbManager(string DBPath)
{
try
{
//连接至对应路径下的数据库中
dbConnection = new SqliteConnection(DBPath);
//打开数据库
dbConnection.Open();
Debug.Log("Connected to db");
}
catch (Exception e)
{
Debug.Log(e);
}
}

// 关闭连接
public void Close()
{
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.");
}

// 执行查询sqlite语句操作
public SqliteDataReader ExecuteQuery(string sqlQuery)
{
dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = sqlQuery;
reader = dbCommand.ExecuteReader();
return reader;
}

// 添加学生数据到指定表
public SqliteDataReader Insert(string studentName, int id)
{
string query = "INSERT INTO student values( '" + studentName + "'," + id + ")";
return ExecuteQuery(query);
}

//删除表中的数据
public SqliteDataReader Delete(string tableName)
{
string query = "DELETE FROM " + tableName;
return ExecuteQuery(query);
}

//创建学生表(姓名,ID)
public SqliteDataReader CreateTable()
{
string query = "create table student ( name nvarchar(100),id int)";
return ExecuteQuery(query);
}
}

然后创建一个SqliteDbTest脚本(该脚本用于绑定物体上,当游戏中发生不同操作时通过SqliteDbHelper类对数据库进行操作)
using UnityEngine;
using System.Collections;
using System;
using Mono.Data.Sqlite;
using System.Data;
using System.IO;

public class SqliteDbTest : MonoBehaviour
{
//数据库管理类
SqliteDbManager db;

void Start()
{
//如果是在unityEditor平台下,则将数据库存于StreamingAsset目录下
#if UNITY_EDITOR
string DBPath = Application.streamingAssetsPath + "/sqlite.db";
Debug.Log(DBPath);
db = new SqliteDbManager("URI=file:"+DBPath);
/*如果是在android平台下
由于在安卓手机上是无法直接读取该文件夹下的数据库文件的
所以需要先使用WWW将数据库文件复制到手机目录下
*/
#elif UNITY_ANDROID
string DBPath = Application.persistentDataPath + "/" + "sqlite.db";
//若路径下的文件不存在,则进行复制
if(!File.Exists(DBPath))
{
WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets/" + "location.db");
File.WriteAllBytes(DBPath, loadDB.bytes);
}
//如果在手机中以存在该文件,可以先删除,再写进去(这样的是保证手机沙盒中的文件不是0字符的空文件)
else
{
WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets/" + "location.db");
File.Delete(DBPath);
File.WriteAllBytes(DBPath, loadDB.bytes);
}
//在这里重新得到db对象。
db = new SqliteDbManager("URI=file:" + DBPath);
#endif
}
void OnGUI()
{
//创建学生表
if (GUILayout.Button("create table"))
{
db.CreateTable();
Debug.Log("success");
}
//插入数据
if (GUILayout.Button("insert data"))
{
db.Insert("张三",1);
Debug.Log("success");
}
//清除数据
if (GUILayout.Button("delete table"))
{
db.Delete("student");
}

if (GUILayout.Button("close database"))
{
db.Close();
}
}
}
将脚本SqliteDbTest 绑定在摄像机上,然后打包出来。
打包的时候需要注意,在player setting下将Api Compatibility Level设置为.Net 2.0,而不是.Net 2.0 Subset
打包在手机上运行,可以通过手机上的RE文件浏览器进入data/data/游戏包名/file文件下查看数据库

源码地址:
链接:http://pan.baidu.com/s/1gfqbix1 密码:aixy

以上技术参考自http://m.blog.csdn.net/article/details?id=46285127
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: