Unity3d对于数据库这块,编辑器以及PC段的链接,只需要相应的链接语句以及路径即可.
但是移动端的链接相对较麻烦,我个人也看了很多网上的连接教程,但是有失败的,也有能够链接上但是没有数据的,等等问题百出.后面经过自己的尝试以及整理,最终得到了能够完整使用的连接方式.
首先,unity下的Android目录需要按照以下方式配置
assets需要小写,这是符合了Android发布后的目录规则,上述四个文件,缺一不可,分别是连接数据库的Mono.Data.Sqlite,封装好的数据库连接方式,引用后直接使用方法
点这里下载
下载好了,按照上面的路劲配置好之后(数据库代码可以自动创建)
想要清晰明了的查看数据库的话,我这里采用的是Navicat 查看的,可以直接网上下载
当上面的步骤全部做好之后,那么我们就可以来链接数据库了
话不多说,直接上代码分析
public class DataBaseManager {
private static DataBaseManager instance;
public static DataBaseManager Instance
{
get
{
if(null == instance)
{
instance = new DataBaseManager();
}
return instance;
}
}
private Text wait;
private SqliteConnection dbConnection;//数据库链接
private SqliteCommand dbCommand;//数据库语言解读
private SqliteDataReader reader;//读取到的数据,有特殊的解读方式
/// <summary>
/// 通过数据库的名字连入数据库
/// </summary>
/// <param name="databasename"></param>
public void ConnectingDatabase(string databasename)
{
#if UNITY_EDITOR
//unity编辑器中
string appDBPath = Application.dataPath + "/Plugins/Android/assets/" + databasename;
DataBaseManager.Instance.OpenDB("URI=file:" + appDBPath);
#elif UNITY_ANDROID
//安卓设备中
wait = GameObject.Find("Wait").GetComponent<Text>();//这里的wait是我用来在android下提示数据库加载的,可以忽略
string appDBPath = Application.persistentDataPath + "/" + databasename;
if (!File.Exists(appDBPath))
{
//现用www先从Unity中下载到数据库
WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets/" + databasename);
while (!loadDB.isDone)
{
wait.text = "等待数据加载中...";
}
//拷贝至规定的地方
File.WriteAllBytes(appDBPath, loadDB.bytes);
wait.text = "数据加载完成!";
MonoBehaviour.Destroy(wait.gameObject, 1f);
}
DataBaseManager.Instance.OpenDB("URI=file:" + appDBPath);
#endif
}
//打开数据库
public void OpenDB(string connectionString)
{
try
{
if (dbConnection == null)
{
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.Dispose();
}
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);
}
}
string appDBPath = Application.dataPath + "/Plugins/Android/assets/" + databasename;
DataBaseManager.Instance.OpenDB("URI=file:" + appDBPath); 通过路径,链接数据库
if (!File.Exists(appDBPath))
{
//现用www先从Unity中下载到数据库
WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets/" + databasename);
while (!loadDB.isDone)
{
wait.text = "等待数据加载中...";
}
最最重要的地方就是上述代码,Android客户端下面,他的文件会没有放入到assets下,这时先判断如果不存在文件,则将编辑器下的文件复制进入指定位置,记住,这里一定要等他复制完成才能继续操作,无论这边使用协程,还是直接循环等待,一定要把他的数据读取完,才能进行操作,不然你会发现,连上数据库了,但是数据库是一个空的数据库,只有等待加载完成,才是你原来的数据库
到这里其实就可以成功的连上数据库了 ,后面就可以进行数据库的增删改查了,这些都比较简单,就是语言封装起来比较费时
版权声明:本文为cjppktc123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。