#region License
// // Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// // email: koroten@ya.ru
// // skype:vladimir-korotenko
// // https://vkorotenko.ru
// // Создано: 13.08.2020 18:06
#endregion
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();
}
}
}
#region License
// // Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// // email: koroten@ya.ru
// // skype:vladimir-korotenko
// // https://vkorotenko.ru
// // Создано: 04.05.2020 9:16
#endregion
using SpecialForcesDirectory.Code;
using SQLite;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace SpecialForcesDirectory.Dbl
{
public class SeriesRepository : BaseUserDatabase
{
private async Task<SQLiteAsyncConnection> GetConn()
{
return await GetDatabaseConnection<Favorite>().ConfigureAwait(false);
}
public async Task<IEnumerable<Series>> GetItems()
{
var conn = await GetConn();
return await AttemptAndRetry(() => conn.Table<Series>().ToListAsync()).ConfigureAwait(false);
}
public async Task<Series> GetItem(int id)
{
var conn = await GetConn();
return await AttemptAndRetry(() => conn.GetAsync<Series>(id)).ConfigureAwait(false);
}
public async Task<int> DeleteItem(int id)
{
var shoots = await GetShootsForSeries(id);
var conn = await GetConn();
foreach (var shoot in shoots)
{
await AttemptAndRetry(() => conn.DeleteAsync<Shoots>(shoot.Id)).ConfigureAwait(false);
}
return await AttemptAndRetry(() => conn.DeleteAsync<Series>(id)).ConfigureAwait(false);
}
public async Task<int> SaveItem(Series item)
{
var conn = await GetConn();
if (item.Id == 0)
return await AttemptAndRetry(() => conn.InsertAsync(item)).ConfigureAwait(false);
await AttemptAndRetry(() => conn.UpdateAsync(item)).ConfigureAwait(false);
return item.Id;
}
/// <summary>
/// Получение списка выстрелов.
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<IEnumerable<Shoots>> GetShootsForSeries(int id)
{
var conn = await GetConn();
return await AttemptAndRetry(() => conn.Table<Shoots>()
.Where(s => s.SeriesId == id)
.OrderByDescending(o => o.Nr)
.ToListAsync()).ConfigureAwait(false);
}
public async Task<int> InsertShootToSeries(Shoots item, int seriesId)
{
item.SeriesId = seriesId;
var conn = await GetConn();
return await AttemptAndRetry(() => conn.InsertAsync(item)).ConfigureAwait(false);
}
public async Task<int> DeleteShootFromSeries(int shootId)
{
var conn = await GetConn();
return await AttemptAndRetry(() => conn.DeleteAsync<Shoots>(shootId)).ConfigureAwait(false);
}
}
}
C# SQLiteDataReader
while (rdr.Read())
{
Console.WriteLine($"{rdr.GetInt32(0)} {rdr.GetString(1)} {rdr.GetInt32(2)}");
}
платежные системы бывают разными.