SQLite+Unity+Android

200
12 декабря 2020, 19:20

Не могу на телефоне подключиться к базе данных SQLite. Пишу игру на Юньке и на компе все классно работает, а вот на телефоне - ничего не пашет, запросы не проходят ни в какую.

Старые методы 2016 года (копирование БД при помощи WWW) уже не работают, а новых я найти не могу. В коде уже перепробовал массу способов.

База данных хранится в папке Assets/Database. Помимо этого она еще есть в папке StramingAssects. Но все равно не работает и не находит эту папку, т.к. Юнька пишет, что метод устарел.

if(Application.platform == RuntimePlatform.Android) 
       {  
            path =Path.Combine(Application.persistentDataPath,"/Database/gb.bytes.db");
            if(!File.Exists(path))
            {
                WWW db = new WWW("jar:file://"+Application.dataPath+"!/assets/Database/gb.bytes.db");
                while(!db.isDone){debug.text = "База данных пока не загружена";}
                File.WriteAllBytes(path,db.bytes);
            }  
        }
Answer 1

Я сделал вот так, и оно отлично работает:

using SQLite;
using System;
using System.IO;
using UnityEngine;
/// <summary>
/// Базовый класс для локальных баз данных SQLite.
/// </summary>
public abstract class PvnSQLiteDB : IDisposable
{
    /// <summary>
    /// Соединение к БД.
    /// </summary>
    public SQLiteConnection Connection;
    protected string SqliteFileNameOnly;
    protected string SqliteFileNameWithPath;
    /// <summary>
    /// Конструктор.
    /// </summary>
    /// <param name="dbFileNameOnly">Имя файла базы данных.</param>
    public PvnSQLiteDB(string dbFileNameOnly)
    {
        Connection = null;
        SqliteFileNameOnly = dbFileNameOnly;
        SqliteFileNameWithPath = Path.Combine(Application.persistentDataPath, SqliteFileNameOnly);
    }
    /// <summary>
    /// Установить соединение.
    /// </summary>
    public virtual void Connect()
    {
        CreateSqliteFileIfNotExists();
        Connection = new SQLiteConnection(/*"URI=file:" +*/ SqliteFileNameWithPath);
    }
    /// <summary>
    /// Создать при необходимости файл БД с начальным наполнением данных
    /// - либо пустой, либо шаблон БД из ресурсов.
    /// </summary>
    private void CreateSqliteFileIfNotExists()
    {
        // если базы еще нет в папке приложения, то создать ее, загрузив из ресурсов 
        // (там лежит БД с начальным заполнением данных)
        if (!File.Exists(SqliteFileNameWithPath))
        {
            string resName = "Databases/" + Path.GetFileNameWithoutExtension(SqliteFileNameOnly);
            var asset = (TextAsset)Resources.Load(resName);
            if (asset != null)
            {
                File.WriteAllBytes(SqliteFileNameWithPath, asset.bytes);
            }
            else
            {
                Debug.LogWarning("Начальная база данных SQLite отсутствует в ресурсе '" + resName + "'. Будет создана пустая БД.");
                File.AppendAllText(SqliteFileNameWithPath, "");
            }
        }
    }
    /// <summary>
    /// Вызывается при уничтожении экземпляра объекта этого класса.
    /// </summary>
    public void Dispose()
    {
        if (Connection != null)
            Connection.Dispose();
    }
}

Файл БД с начальным наполнением надо положить в Resources/Databases. Если не положить, то код создаст пустую БД.

В конструктор надо передать имя файла без пути.

READ ALSO
c# преобразовать Db DataReader в Dictionary

c# преобразовать Db DataReader в Dictionary

беру инфу из базы, при получении полей получаются много dreader["field_name"]ToString() можно ли перевести сразу DataReader в Dictionary чтобы избавиться от кучи...

114
При пагинации EF выдаёт ошибку Incorrect syntax near &#39;OFFSET&#39;

При пагинации EF выдаёт ошибку Incorrect syntax near 'OFFSET'

Я использую следующий код для пагинации в EF Core:

127
Получения списка wifi android. _wifi.ScanResults пуст

Получения списка wifi android. _wifi.ScanResults пуст

Мне необходимо получить список доступных wifi сетейНа теперешний момент есть такой код

125
SQL UPDATE запрос c#

SQL UPDATE запрос c#

Хочу сделать запрос на обновление данныхВот мой код

127