Как работать с базой SQLite?

Общие вопросы о Unity3D

Как работать с базой SQLite?

Сообщение EIvanov 15 сен 2022, 01:33

На хабре статьи 2020 года, половины файлов просто нет в папках движка (видимо движок обновился).
Нужно работать с SQLite под виндовс и андроид.
Можете дать ссылку на актуальную статью? Где качать библиотеки и что и куда копировать/ставить.

PS
В визуалстудио под C# работал с SQLite без проблем (ставил расширения через nuget и работал).
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как работать с базой SQLite?

Сообщение 1max1 15 сен 2022, 03:00

Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как работать с базой SQLite?

Сообщение EIvanov 17 сен 2022, 20:16

1max1 писал(а):https://github.com/robertohuertasm/SQLite4Unity3d

Посмотрел, скачал. Запустил пример из проекта. Пример работает.
Посмотрел код скриптов - в принципе почти все понятно, но...в коде нет ни одного SQL запроса.
Как выполнить SQL запрос?

Синтаксис:
Используется csharp
public void CreateDB(){
                _connection.DropTable<Person> ();
                _connection.CreateTable<Person> ();

                _connection.InsertAll (new[]{
                        new Person{
                                Id = 1,
                                Name = "Tom",
                                Surname = "Perez",
                                Age = 56
                        },
                        new Person{
                                Id = 2,
                                Name = "Fred",
                                Surname = "Arthurson",
                                Age = 16
                        }

                });
        }

        public Person GetJohnny(){
                return _connection.Table<Person>().Where(x => x.Name == "Johnny").FirstOrDefault();
        }

 


PS
Похоже на ORM, но я без понятия что это за ORM.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как работать с базой SQLite?

Сообщение 1max1 17 сен 2022, 21:08

Сам не юзал, но возможно этот метод https://github.com/robertohuertasm/SQLi ... te.cs#L662
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как работать с базой SQLite?

Сообщение EIvanov 18 сен 2022, 00:19

1max1 писал(а):Сам не юзал, но возможно этот метод https://github.com/robertohuertasm/SQLi ... te.cs#L662


Этот метод работает только для INSERTs, UPDATEs, and DELETEs. Уже что то, но нужно получать данные из БД.
Вот так работает.
Синтаксис:
Используется csharp
string dbPath = string.Format(@"Assets/StreamingAssets/{0}", "mybase.db");
var connection = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create);
string sqlQuery ="INSERT INTO mytable (field1, field2) VALUES ('тест1', 'Test2')";
string sqlParams ="";
int result = connection.Execute (sqlQuery, sqlParams); // Работает. Вставляет данные в БД.


Но там говориться ещё и о
Use this method instead of Query when you don't expect rows back.

То есть где то есть метод Query .. наверно.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как работать с базой SQLite?

Сообщение Saltant 18 сен 2022, 02:42

Если будет много DB логики, то лучше юзать какую нить ORM которая работает c SQLite.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Как работать с базой SQLite?

Сообщение seaman 19 сен 2022, 21:16

seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как работать с базой SQLite?

Сообщение EIvanov 27 сен 2022, 22:45

Путем проб и ошибок, поиска информации в интернете, тестирования сам пришел написанному ниже рабочему варианту.
Выкладываю его тут - вдруг кому то понадобится.

Работа игры использующей SQLite проверена 20.09.2022 на ОС Windows 7 Windows 10, версиях x86 и x64.
Использовал Unity 2021.3.10f1.

В интернете есть похожие инструкции, но с ошибками. А именно путь к файлам, которые мы копируем в папку Pluging указан не верный.
В результате игра работает только на Windows x64 или на x86 (в зависимости от инструкции). Или версия x64 не работает на x86.
В моем случае (путь Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32) всё работает на всех версиях ОС.


Работа с БД SQLite в UNITY

Для работы с SQLite нужно:
1) Создать базу, например mybase.db.
2) Создать папкуAssets\StreamingAssets и скопировать туда базу.
3) Загрузить с сайта https://www.sqlite.org/download.html
Precompiled Binaries for Windows 32-bit DLL (x86) for SQLite
Precompiled Binaries for Windows 64-bit DLL (x86) for SQLite
Precompiled Binaries for Android
zip и aar файлы - это архивы. Нужно разархивировать файлы.
4) Создать папку Assets\Plugins
5) Создать папки Assets\Plugins\x86, Assets\Plugins\x64 и Assets\Plugins\Android.
6) В архиве aar sqlite-android-3390300\jni\x86_64 взять файл libsqliteX.so и переименовать его в libsqlite.so.
7) Скопировать libsqlite.so в папку Assets\Plugins\Android.
8) Из каждого zip архива взять файл sqlite3.dll и скопиривать его в соответствующие папки Assets\Plugins\x86 и Assets\Plugins\x64.
9) В папку Assets\Plugins скопировать файлы из папки C:\Program Files\Unity\Hub\Editor\2021.3.10f1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32
Файлы:
Mono.Data.Sqlite.dll
System.Configuration.dll
System.Data.dll
System.EnterpriseServices.dll
System.Security.dll
Если Unity в дебаггере/консоли покажет, что в проекте уже используется загруженная dll - то удалить этот файл из папки Plugins.
Далее можно будет работать с БД, используя скрипт.

Скрипт

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Data;
using System;
using UnityEngine.UI;
using Mono.Data.Sqlite; // Используем Sqlite.

public class Connection : MonoBehaviour
{
public void setConnection()
{

string path = Application.dataPath + "/StreamingAssets/base/mybase.db";
string sqlCommandText = "SELECT name FROM users";

SqliteConnection connection = new SqliteConnection("Data Source="+path);
connection.Open();
if (connection.State == ConnectionState.Open)
{
SqliteCommand sqliteCommand = new SqliteCommand();
sqliteCommand.Connection = connection;
sqliteCommand.CommandText = sqlCommandText;
SqliteDataReader sqliteDataReader = sqliteCommand.ExecuteReader(); // Ридер - читает данные и возвращает объект типа odject.

// Если строк много - выполняем код в цикле.
while (sqliteDataReader.Read())
{

// Мы можем получать данные из ридера разными способами.
var id = sqliteDataReader.GetValue(0); // C помощью метода GetValue. Получим первое значение.
object id = sqliteDataReader[0]; // Аналогично, но через индексатор ридера.
object id = sqliteDataReader["id"]; // Через название столбца.

// Пример конвертации результатов из object в string.
string id=sqliteDataReader["id"].ToString();
// Пример конвертации результатов из object в int.
int age =Convert.ToInt32(sqliteDataReader["age"]);

}


// Если в таблице всего одна строка - то можно просто обратиться к ней, без цикла.
object id = sqliteDataReader["id"];
int age =Convert.ToInt32(sqliteDataReader["age"]);

}
connection.Close();
}
}

 


Ошибка Loading assembly failed: "Assets/Plugins/Mono.Data.Sqlite.dll" reason: File does not contain a valid CIL image - не влияет на работу. Как пишут в интернете - это баг Unity.
Если возникает ошибка unity error plastic scm null reference, то надо удалить из проекта пакет Version Control Package (Меню->Window->Package Manager).
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 9