Unity3D链接Android手机端数据库

  • Post author:
  • Post category:其他


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 版权协议,转载请附上原文出处链接和本声明。