Профиль пользователя заблокирован сроком с 16 октября 2023 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу SQLite
  • Почему функция count() увеличивает время запроса в 5 раз?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Попробуйте

    SELECT COUNT( t1.id ) 
      FROM t4;
    Ответ написан
    Комментировать
  • Как просмотреть таблицу sqlite?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    мне нравится вот это
    https://sqlitestudio.pl/
    Ответ написан
    Комментировать
  • Как прочитать таблицу SQLite в DataTable?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Ответ написан
    Комментировать
  • Как подключить готовую БД SQLite к проекту на C# WinForms?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    #region License
    
    // Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
    // email: koroten@ya.ru
    // skype:vladimir-korotenko 
    // https://vkorotenko.ru
    // Создано:  09.04.2019 23:04
    
    #endregion
    
    using SpecialForcesDirectory.Code;
    using System.IO;
    
    namespace SpecialForcesDirectory.Dbl
    {
        public class DataContext
        {
            private static readonly object Lock = new object();
            private static DataContext _ctx;
    
            public ContentDatabase ContentData { get; private set; }
            public UserDatabase UserDatabase { get; private set; }
    
    
            private DataContext()
            {
                ContentData = new ContentDatabase();
                UserDatabase = new UserDatabase();
            }
    
    
            public static DataContext Instance
            {
                get
                {
                    lock (Lock)
                    {
                        if (_ctx != null) return _ctx;
                        _ctx = new DataContext();
                        return _ctx;
                    }
                }
            }
    
    
    
    
          
    
            public static void Close()
            {
                if (_ctx == null) return;
                lock (Lock)
                {
                    if (_ctx.ContentData != null)
                    {
                        _ctx.ContentData.Clear().Wait();
                        _ctx.ContentData = null;
                    }
    
                    if (_ctx.UserDatabase == null) return;
                    _ctx.UserDatabase.Clear().Wait();
                    _ctx.UserDatabase = null;
                    _ctx = null;
                }
            }
    
            /// <summary>
            ///     Перезаписывает базу данных при обновлении, корректно закрывая ресурсы.
            /// </summary>
            /// <param name="file"></param>
            public static void UpdateFile(byte[] file)
            {
                var fp = BaseContentDatabase.DatabasePath;
                Close();
                lock (Lock)
                {
                    File.WriteAllBytes(fp, file);
                    _ctx = new DataContext();
                }
            }
    
            public static void DropFile()
            {
                var fullPath = BaseContentDatabase.DatabasePath;
                var userDb = BaseUserDatabase.DatabasePath;
                Close();
                lock (Lock)
                {
                    File.Delete(fullPath);
                    File.Delete(userDb);
                }
            }
        }
    }


    #region License
    // // Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
    // // email: koroten@ya.ru
    // // skype:vladimir-korotenko
    // // https://vkorotenko.ru
    // // Создано:  13.08.2020 14:07
    #endregion
    
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using SpecialForcesDirectory.Code;
    using SpecialForcesDirectory.Models;
    using SQLite;
    
    namespace SpecialForcesDirectory.Dbl
    {
        public class ContentDatabase : BaseContentDatabase
        {
            #region Category repository
            private async Task<SQLiteAsyncConnection> GetCategoryConn()
            {
                return await GetDatabaseConnection<Category>().ConfigureAwait(false);
            }
            public async Task<IEnumerable<Category>> GetCategories()
            {
                var conn = await GetCategoryConn();
                return await AttemptAndRetry(() => conn.Table<Category>().ToListAsync()).ConfigureAwait(false);
            }
            public async Task<Category> GetCategory(int id)
            {
                var conn = await GetCategoryConn();
                return await AttemptAndRetry(() => conn.GetAsync<Category>(id)).ConfigureAwait(false);
            } 
            #endregion
    
            #region Content Repository
            private async Task<SQLiteAsyncConnection> GetCtxConn()
            {
                return await GetDatabaseConnection<Content>().ConfigureAwait(false);
            }
            
            public async Task<IEnumerable<Content>> GetItems()
            {
                var conn = await GetCtxConn();
                return await AttemptAndRetry(() => conn.Table<Content>().ToListAsync()).ConfigureAwait(false);
            }
    
            public async Task<Content> GetItem(int id)
            {
                var conn = await GetCtxConn();
                return await AttemptAndRetry(() => conn.GetAsync<Content>(id)).ConfigureAwait(false);
            }
    
            public async Task<int> DeleteItem(int id)
            {
                var conn = await GetCtxConn();
                return await AttemptAndRetry(() => conn.DeleteAsync<Content>(id)).ConfigureAwait(false);
            }
    
            public async Task SaveItem(Content item)
            {
                var conn = await GetCtxConn();
                if (item.Id == 0) await AttemptAndRetry(() => conn.InsertAsync(item)).ConfigureAwait(false);
                await AttemptAndRetry(() => conn.UpdateAsync(item)).ConfigureAwait(false);
            }
    
            public async Task<IEnumerable<SRawItem>> GetItemsByQuery(string q, int lim)
            {
                var qu = q.ToUpper();
                var list = new List<SRawItem>();
                var conn = await GetCtxConn();
                var result = conn.Table<Content>()
                    .Where(x => x.EnableTab1 == 1 && x.Tab1.ToUpper().Contains(qu)
                                || x.EnableTab2 == 1 && x.Tab2.ToUpper().Contains(qu)
                                || x.EnableTab3 == 1 && x.Tab3.ToUpper().Contains(qu)).Take(lim);
    
                var r = await result.ToListAsync();
                foreach (var content in r)
                {
                    var st = GetSt(content, qu);
                    var title = await conn.Table<Category>().Where(x => x.Id == content.CatId).FirstAsync();
                    var ni = new SRawItem
                    {
                        Body = st.Body,
                        CatId = content.CatId.ToString(),
                        Title = title.Title,
                        Id = content.Id.ToString(),
                        MType = "a",
                        Tab = st.Tab
                    };
                    list.Add(ni);
                }
    
                return list;
            }
    
            private static TabStruct GetSt(Content content, string q)
            {
                if (content.Tab1.ToUpper().Contains(q))
                    return new TabStruct { Tab = "1", Body = content.Tab1 };
                if (content.Tab2.ToUpper().Contains(q))
                    return new TabStruct { Tab = "2", Body = content.Tab2 };
                return new TabStruct { Tab = "3", Body = content.Tab3 };
            }
    
            private struct TabStruct
            {
                public string Body { get; set; }
                public string Tab { get; set; }
            }
    
            #endregion
    
            public async Task Clear()
            {
                await BaseContentDatabase.Close();
            }
        }
    }


    В проект вставите
    <PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
    Ответ написан
    Комментировать
  • Как синхронизировать два файла базы данных sqlite в приложении на python?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Все описано в документации
    https://www.sqlite.org/whentouse.html

    По идее на малых нагрузках он должен отрабатывать нормально, но пишут во первых о возможных тормозах, и о возможном разрушении бд.

    Ультимативный путь это поставить бд клиент серверную и переписать программу.
    Менее ультимативный это создать lock файл и перед изменением данных проверять блокировку. Файл просто 0 длины.

    FILE* f = fopen("myfile.txt", "w");
    int result = flock(fileno(f)), LOCK_EX);
    
    // . . . .
    // Locked file in use 
    // . . . .
    int release = flock(f, LOCK_UN);  // Unlock the file . . .
    Ответ написан
    1 комментарий
  • Как организовать файловую систему в БД?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Зачем что то хранить если оно есть?
    Отдавайте им файловую структуру
    Ответ написан
  • Как переработать код сервера?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Это просто имя столбца
    Reader["Password"]

    Ну используйте Reader[1] // или там какой он по порядку, в чем то проблема?
    Ответ написан
  • Можно ли конвертировать базу данных sqlite в скрипт sql без sqlite3?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Sqlite и есть библиотека. Подключайте и дампите на здоровье.
    sqlite3 это просто консоль для выполнения комманд. Впрочем и ее можно вызвать передав параметры.
    Ответ написан
    Комментировать
  • Как проверить пересечение SQL lite?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Блин я вот не понял что за пересечение. Строки начинаются с одной подстроки? Тогда выделите эту подстроку и используйте like
    Ответ написан
    Комментировать
  • Правильно ли я создала БД с такими названиями таблиц и нужно ли всегда делать модели для БД для миграции?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Стабилизируйте бд . Это главный совет. Миграции лучше применять позже. Есть куча утилит для синхронизации инстансов, в том числе и с разными схемами. В нормальном случае процесс применения миграций выглядит так: вы последовательно выполняете скрипты миграций по порядку. После обновляете кол приложения.
    Ответ написан
    4 комментария
  • Как вывести все таблицы из бд sqlite3?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
  • Как подключить базу данных в приложение Xamarin.Forms?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Опишу одно из своих:

    Бэкенд написанный на PHP давным давно.

    Xamarin.FORM приложение отображающиее разделы, подразделы и статьи.
    Приложение может сохранять все статьи для доступа в офлайне.

    Соответственно есть сервис который отдает одинаковые данные для обоих режимов.
    При попытке перехода в офлайн пользователю выводится предложение о скачивании всех ресурсов ок 60 мб.

    Дальше оно работает offline.

    Вот базовые классы

    using System;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    using Polly;
    using SQLite;
    using Xamarin.Essentials;
    
    namespace SpecialForcesDirectory.Code
    {
        public abstract class BaseContentDatabase
        {
            public static readonly string DatabasePath = Path.Combine(FileSystem.AppDataDirectory, Settings.DataBaseName);
            static readonly Lazy<SQLiteAsyncConnection> DatabaseConnectionHolder = new Lazy<SQLiteAsyncConnection>(() => new SQLiteAsyncConnection(DatabasePath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache));
    
            private static SQLiteAsyncConnection DatabaseConnection => DatabaseConnectionHolder.Value;
    
    
            protected static async ValueTask<SQLiteAsyncConnection> GetDatabaseConnection<T>()
            {
                if (DatabaseConnection.TableMappings.Any(x => x.MappedType == typeof(T))) return DatabaseConnection;
                // On sqlite-net v1.6.0+, enabling write-ahead logging allows for faster database execution
                await DatabaseConnection.EnableWriteAheadLoggingAsync().ConfigureAwait(false);
                await DatabaseConnection.CreateTablesAsync(CreateFlags.None, typeof(T)).ConfigureAwait(false);
                return DatabaseConnection;
            }
    
            public static Task<T> AttemptAndRetry<T>(Func<Task<T>> action, int numRetries = 10)
            {
                return Policy.Handle<SQLiteException>().WaitAndRetryAsync(numRetries, PollyRetryAttempt).ExecuteAsync(action);
    
                static TimeSpan PollyRetryAttempt(int attemptNumber) => TimeSpan.FromMilliseconds(Math.Pow(2, attemptNumber));
            }
    
            protected static async Task Close()
            {
                await DatabaseConnection.CloseAsync();
            }
        }
    public class ContentDatabase : BaseContentDatabase
        {
            #region Category repository
            private async Task<SQLiteAsyncConnection> GetCategoryConn()
            {
                return await GetDatabaseConnection<Category>().ConfigureAwait(false);
            }
            public async Task<IEnumerable<Category>> GetCategories()
            {
                var conn = await GetCategoryConn();
                return await AttemptAndRetry(() => conn.Table<Category>().ToListAsync()).ConfigureAwait(false);
            }
            public async Task<Category> GetCategory(int id)
            {
                var conn = await GetCategoryConn();
                return await AttemptAndRetry(() => conn.GetAsync<Category>(id)).ConfigureAwait(false);
            } 
            #endregion
    
            #region Content Repository
            private async Task<SQLiteAsyncConnection> GetCtxConn()
            {
                return await GetDatabaseConnection<Content>().ConfigureAwait(false);
            }
            
            public async Task<IEnumerable<Content>> GetItems()
            {
                var conn = await GetCtxConn();
                return await AttemptAndRetry(() => conn.Table<Content>().ToListAsync()).ConfigureAwait(false);
            }
    
            public async Task<Content> GetItem(int id)
            {
                var conn = await GetCtxConn();
                return await AttemptAndRetry(() => conn.GetAsync<Content>(id)).ConfigureAwait(false);
            }
    
            public async Task<int> DeleteItem(int id)
            {
                var conn = await GetCtxConn();
                return await AttemptAndRetry(() => conn.DeleteAsync<Content>(id)).ConfigureAwait(false);
            }
    
            public async Task SaveItem(Content item)
            {
                var conn = await GetCtxConn();
                if (item.Id == 0) await AttemptAndRetry(() => conn.InsertAsync(item)).ConfigureAwait(false);
                await AttemptAndRetry(() => conn.UpdateAsync(item)).ConfigureAwait(false);
            }
    
            public async Task<IEnumerable<SRawItem>> GetItemsByQuery(string q, int lim)
            {
                var qu = q.ToUpper();
                var list = new List<SRawItem>();
                var conn = await GetCtxConn();
                var result = conn.Table<Content>()
                    .Where(x => x.EnableTab1 == 1 && x.Tab1.ToUpper().Contains(qu)
                                || x.EnableTab2 == 1 && x.Tab2.ToUpper().Contains(qu)
                                || x.EnableTab3 == 1 && x.Tab3.ToUpper().Contains(qu)).Take(lim);
    
                var r = await result.ToListAsync();
                foreach (var content in r)
                {
                    var st = GetSt(content, qu);
                    var title = await conn.Table<Category>().Where(x => x.Id == content.CatId).FirstAsync();
                    var ni = new SRawItem
                    {
                        Body = st.Body,
                        CatId = content.CatId.ToString(),
                        Title = title.Title,
                        Id = content.Id.ToString(),
                        MType = "a",
                        Tab = st.Tab
                    };
                    list.Add(ni);
                }
    
                return list;
            }
    
            private static TabStruct GetSt(Content content, string q)
            {
                if (content.Tab1.ToUpper().Contains(q))
                    return new TabStruct { Tab = "1", Body = content.Tab1 };
                if (content.Tab2.ToUpper().Contains(q))
                    return new TabStruct { Tab = "2", Body = content.Tab2 };
                return new TabStruct { Tab = "3", Body = content.Tab3 };
            }
    
            private struct TabStruct
            {
                public string Body { get; set; }
                public string Tab { get; set; }
            }
    
            #endregion
    
            public async Task Clear()
            {
                await BaseContentDatabase.Close();
            }
        }
    [Table("quote")]
        public class Quote
        {
            [PrimaryKey]
            [AutoIncrement]
            [Column("id")] 
            public int Id { get; set; }
    
            [Column("author")] public string Author { get; set; }
    
            [Column("body")] public string Body { get; set; }
    
            [Column("image")] public string Image { get; set; }
    
            [Column("created")] public DateTime Created { get; set; }
        }
    
    public class QuoteRepository : BaseUserDatabase
        {
            private async Task<SQLiteAsyncConnection> GetConn()
            {
                return await GetDatabaseConnection<Quote>().ConfigureAwait(false);
            }
            public async Task<IEnumerable<Quote>> GetItems()
            {
                var conn = await GetConn();
                return await AttemptAndRetry(() => conn.Table<Quote>().ToListAsync()).ConfigureAwait(false);
            }
    
            public async Task<Quote> GetItem(int id)
            {
                var conn = await GetConn();
                return await AttemptAndRetry(() => conn.GetAsync<Quote>(id)).ConfigureAwait(false);
            }
    
            public async Task<int> DeleteItem(int id)
            {
                var conn = await GetConn();
                return await AttemptAndRetry(() => conn.DeleteAsync<Quote>(id)).ConfigureAwait(false);
            }
    
            public async Task<int> SaveItem(Quote item)
            {
                var conn = await GetConn();
                return await AttemptAndRetry(() => conn.InsertOrReplaceAsync(item)).ConfigureAwait(false);
            }
    
            public async Task DeleteAll()
            {
                var conn = await GetConn();
                await AttemptAndRetry(() => conn.DeleteAllAsync<Quote>()).ConfigureAwait(false);
            }
        }
    
    
    }
    Ответ написан
    Комментировать
  • Как SQLite встроить в сайт?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Не использовать SQLite. Для этого есть куча причин и первая он для этого не предназначен!!!
    На сервере сделайте контроллер который отдаёт json c результатами запроса к нормальной БД, если только чтение то можно использовать SQLite но опять же с опаской
    Ответ написан
    7 комментариев
  • С#: Импорт большого csv-файла в БД SQLite. Как это сделать?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    https://www.bricelam.net/2017/07/20/sqlite-bulk-in....

    https://stackoverflow.com/questions/364017/faster-...
    Установите pragmas
    synchronous = OFF + locking_mode = EXCLUSIVE + journal_mode = OFF


    И используйте пакетную вставку по 50 000 элементов
    Ответ написан
    2 комментария
  • Конвертация ФИАС в MySQL или Sqlite. Как?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Посмотрите в эту сторону.
    https://github.com/vkorotenko/FiasServer

    Вот драйвер для выгрузки в MSSQL
    https://github.com/vkorotenko/FiasServer/tree/mast...

    В принципе руки когда дойдут первый кандидат это MySql
    Если напишите свой драйвер будет вам огромное спасибо.
    Ответ написан
    Комментировать
  • Как синхронизировать базу данных между сервером (PostgreSQL) и клиентом (SQLite)?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Поищите вот тут.
    https://www.google.com/search?q=postgresql+sqlite+...

    Если сугубо руками. То нужно сделать следующее, не важно через веб сервис или через sqldump

    1. Перенос всех словарей (1 раз)
    2. Перенос всех данных или поднабора (1 раз)
    3. Процесс синхронизации клиента и сервера (много раз)

    Итак п.1 в данный момент формируется схема обмена данными и фиксируется, важно что бы в дальнейшем учитывать изменения в БД. Перенос происходит на клиент либо руками, либо с помощью сервиса.
    GET /api/dbsync/getdictionaries/
    {
    "schema": "0.4",
    [ 
    { "name":"cityes", "sql": "create table ....."},
    .....
    ]
    }


    где передается схема и дата начала
    GET /api/dbsync/getdata/0.4/31.05.2020
    Этот запрос отдает поднабор данных или просто список таблиц которые нужно создать.
    обратите внимание на первичные ключи, желательно что бы они были типа UUID или GUID
    либо таблицы содержали служебные поля позволяющие идентифицировать пользователя.
    Кроме того необходимы поля created, updated
    Также важно что бы данные отдавались конкретно для этого пользователя. Типичный пример таблица users будет содержать только его, и возможно список его подчиненных, а таблица customer только его заказчиков

    пункт 3
    GET /api/dbsync/sync/0.4/31.05.2020
    получение с сервера только дельты данных на указанный период

    POST /api/dbsync/sync/0.4
    логика клиента формирует пакет изменений, сервер сам разбирается что закоммитить, а на какие данные ругнуться, мол уже исправлено это какие изменения оставить.
    В ответ выдается список статусов для каждой записи.

    Вот примерная простая схема.
    Ответ написан
    Комментировать
  • Почему dotnet приложение работающее как сервис в Ubuntu 16.04 не может открыть SQLite БД?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    пользователь www-data имеет права на чтение базы?
    ls -la /var/myapp
    Ответ написан
    Комментировать
  • Почему вылезает ошибка при создании БД SQLite в C#?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Может вы не закрыли студию и она лочит файл, а может вы используете 2 версию вместо 3 й.
    Проверьте это все.

    UPD добавьте конструктор и в нем проверяйте создались ли таблицы.
    public Context()
    {
    Database.EnsureCreated();
    }
    Ответ написан
  • Как правильно прописать обращение к БД в Android?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Попробуйте подключить через вот этот пакет.
    https://github.com/praeclarum/sqlite-net

    В обоих версиях apk присутствуют so
    Ответ написан
  • Как прикрутить SQlite к вебсерверу Lighttpd на Ubuntu 18.04?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Ваш следующий вопрос будет как восстановить SQLight после крэша.
    Во всех учебниках ВОТ ТАКИМИ буквами пишут предупреждение, не используйте в проде и многопользовательской среде.

    PS MySQL прекрасно тюнится под маломощные машины. Отключите Inodb, задайте лимиты на память и получите записную книжку с sql интерфейсом.
    Ответ написан
    3 комментария