Код: Выделить всё
namespace ESP.Services
публичный класс LocalStoreService
{
#region Properties
Код: Выделить всё
private IBlobCache _cache;
private static LocalStoreService _instance;
#endregion
public static LocalStoreService Instance
{
get
{
if (_instance != null)
return _instance;
return _instance = new LocalStoreService();
}
}
public LocalStoreService()
{
BlobCache.ApplicationName = "ESPdb";
_cache = BlobCache.UserAccount;
var settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All,
};
Locator.CurrentMutable.RegisterConstant(settings, typeof(JsonSerializerSettings));
BlobCache.EnsureInitialized();
}
public void Start()
{
var settings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All,
};
Locator.CurrentMutable.RegisterConstant(settings, typeof(JsonSerializerSettings));
}
public async Task Shutdown()
{
await BlobCache.Shutdown();
}
public async Task Flush()
{
await _cache.Flush();
}
public async Task CompactDatabase()
{
await _cache.Flush();
await _cache.Vacuum();
}
public async Task ClearDatabase()
{
await _cache.InvalidateAll();
}
public async Task GetRecordOrDefault(string sKey)
{
return await _cache.GetOrCreateObject(sKey, () => default(T));
}
public async Task GetRecord(string sKey) where T : new()
{
return await _cache.GetObject(sKey)
.Catch(Observable.Return(new T()));
}
public async Task GetOrFetchRecord(string sKey, Func fetchFunc, DateTimeOffset? expires = null) where T : new()
{
return await _cache.GetOrFetchObject(
sKey,
fetchFunc,
expires ?? ExpireDate.CacheStandardExpire).Catch(Observable.Return(new T()));
}
public IObservable GetAndFetchLatest(string sKey, Func fetchFunc, DateTimeOffset? expires = null)
{
return _cache.GetAndFetchLatest(
sKey,
fetchFunc,
offset =>
{
//return true;
TimeSpan elapsed = DateTimeOffset.Now - offset;
var exp = (expires ?? ExpireDate.CacheStandardExpire) - DateTime.Now;
return elapsed > exp;
});
}
public async Task GetAllRecords()
{
try
{
return (IEnumerable)await _cache.GetAllObjects();
}
catch (Exception e)
{
MessagingCenter.Send(e, MessageKeys.ExceptionOccurred);
return new List();
}
}
public async Task PutRecord(string sKey, T data, DateTimeOffset? expires = null)
{
if (expires == null) { expires = ExpireDate.CacheStandardExpire; }
try
{
if (data is IBaseModel)
{
//Update change date
((IBaseModel)data).ChangeDate = DateTimeOffset.Now;
}
Unit result = await _cache.InsertObject(sKey, data, expires);
}
catch (Exception e)
{
MessagingCenter.Send(e, MessageKeys.ExceptionOccurred);
}
}
public async Task DeleteRecord(string sKey)
{
try
{
await _cache.Invalidate(sKey);
}
catch (Exception e)
{
MessagingCenter.Send(e, MessageKeys.ExceptionOccurred);
}
}
public async Task DeleteRecordIfExists(string sKey)
{
try
{
var obj = await _cache.GetObject(sKey).Catch(Observable.Return(default(T)));
if (obj == null)
return false;
await _cache.InvalidateObject(sKey);
return true;
}
catch (Exception e)
{
MessagingCenter.Send(e, MessageKeys.ExceptionOccurred);
return false;
}
}
}
Android 16 потребует размера страницы 16 КБ, общая библиотека libe_sqlite3.so не имеет размера страницы 16 КБ. Пожалуйста, сообщите авторам пакета NuGet «SQLitePCLRaw.lib.e_sqlite3.android» версии «2.1.8», который содержит 'C:\Users\smanmode.nuget\packages\sqlitepclraw.lib.e_sqlite3.android\2.1.8\lib\net6.0-android31.0\SQLitePCLRaw.lib.e_sqlite3.android.aar'. Дополнительную информацию см. на странице https://developer.android.com/guide/pra ... page-sizes.
Эта проблема возникла после того, как я начал обновлять библиотеку для размера страницы 16 КБ.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -9-in-maui
Мобильная версия