Одиночное соединение и многопоточность чтения и записи через SQLite. NET PCL и Xamarin Android - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть приложение Xamarin Android, которое использует SQLite net ниже.

https://github.com/praeclarum/sqlite-net ver 1.5.231

Я хочу знать:

1, если поточно-ориентированный для чтения и записи базы данных одновременно с использованием одного соединения.

2 Приведет ли это к какой-либо ошибке или неопределенному блокированию между операциями дБ.

Любое улучшение кода, если требуется

 public class SQLiteAsyncConnectionWrapper : ISQLiteAsyncConnectionWrapper
    {
        private const string DatabaseFileName = "DB.db3";

        private SQLiteAsyncConnection _dbConnection;

        public void InitializeDatabaseConnection()
        {
            if (_dbConnection != null)
            {
                return;
            }

            var dbPath = GetDatabaseFilePath();

            _dbConnection = new SQLiteAsyncConnection(dbPath, SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.FullMutex);
        }

        public Task CreateRepositoryAsync<T>() where T : new()
        {
            return _dbConnection.CreateTableAsync<T>();
        }

        public Task<List<T>> WhereAsync<T>(Expression<Func<T, bool>> predicate) where T : new()
        {
            return _dbConnection.Table<T>().Where(predicate).ToListAsync();
        }

        public Task<int> InsertAsync<T>(T value) where T : new()
        {           
            return _dbConnection.InsertAsync(value);
        }

        public Task<int> UpdateAsync<T>(T value) where T : new()
        {           
            return _dbConnection.UpdateAsync(value);
        }

        public Task<int> DeleteAsync<T>(object primaryKey) where T : new()
        {
            return _dbConnection.DeleteAsync<T>(primaryKey);
        }

        private string GetDatabaseFilePath()
        {
            return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), DatabaseFileName);
        }
    }

Приведенный ниже код также используется для работы с дБ

public class SQLiteAsyncTableQueryWrapper<T> : ISQLiteAsyncTableQueryWrapper<T> where T : new()
    {
        private readonly AsyncTableQuery<T> _asyncTableQuery;

        public SQLiteAsyncTableQueryWrapper(AsyncTableQuery<T> asyncTableQuery)
        {
            _asyncTableQuery = asyncTableQuery;
        }

        public Task<T> FirstOrDefaultAsync()
        {
            return _asyncTableQuery.FirstOrDefaultAsync();
        }

        public Task<T> FirstOrDefaultAsync(Expression<Func<T, bool>> predicate)
        {
            return _asyncTableQuery.FirstOrDefaultAsync(predicate);
        }

        public Task<List<T>> ToListAsync()
        {
            return _asyncTableQuery.ToListAsync();
        }

        public ISQLiteAsyncTableQueryWrapper<T> Where(Expression<Func<T, bool>> predicate)
        {
            var asyncTableQuery = _asyncTableQuery.Where(predicate);
            var asyncTableQueryWrapper = new SQLiteAsyncTableQueryWrapper<T>(asyncTableQuery);

            return asyncTableQueryWrapper;
        }

        public ISQLiteAsyncTableQueryWrapper<T> OrderByDescending<U>(Expression<Func<T, U>> orderExpr)
        {
            var asyncTableQuery = _asyncTableQuery.OrderByDescending(orderExpr);
            var asyncTableQueryWrapper = new SQLiteAsyncTableQueryWrapper<T>(asyncTableQuery);

            return asyncTableQueryWrapper;
        }

        public ISQLiteAsyncTableQueryWrapper<T> OrderBy<U>(Expression<Func<T, U>> orderExpr)
        {
            var asyncTableQuery = _asyncTableQuery.OrderBy(orderExpr);
            var asyncTableQueryWrapper = new SQLiteAsyncTableQueryWrapper<T>(asyncTableQuery);

            return asyncTableQueryWrapper;
        }
    }

Одиночное соединение

builder.RegisterType<SQLiteAsyncConnectionWrapper>().As<ISQLiteAsyncConnectionWrapper>().SingleInstance();

Любая ссылка будет оценена

https://github.com/praeclarum/sqlite-net/issues/676
https://www.sqlite.org/threadsafe.html
https://www.sqlite.org/c3ref/open.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...