У меня есть приложение 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