Я использую lightDB в качестве локальной базы данных в своем приложении для iOS и Android, реализованном в Xamarin Forms. Я пытаюсь сохранить свой локальный liteDB в облаке с помощью Azure. Мы внедрили API REST, который может получать byte[]
, но у меня проблема с получением документов liteDB на byte[]
. Если я попытаюсь прочитать файл, используя File.ReadAllBytes(LiteDbPath)
, где мы сохранили liteDB, я получу System.IO.IOException: Sharing violation on path
. Я предполагаю, что это не способ сделать это, но я не могу понять, как это сделать. У кого-нибудь есть предложения, как это сделать?
Возможно, я использую это неправильно, я совершенно неопытен в этой области.
Обновление: больше подробностей, чтобы было яснее, что я сделал и что хочу сделать.
Это наш класс DataStore (где мы используем LiteDB):
[assembly: Dependency(typeof(DataStore<Zystem>))]
namespace AirGlow_App.Services {
class DataStore<T> {
public void Close()
{
var db = new LiteRepository(LiteDbPath);
db.Dispose();
}
public LiteQueryable<T> Get()
{
using (var db = new LiteRepository(LiteDbPath))
{
try
{
return db.Query<T>();
}
catch (Exception ex)
{
Debug.WriteLine($"Exception when doing Get. Exception = {ex.Message}.", TypeDescriptor.GetClassName(this));
//TODO : General Error Handling
return null;
}
}
}
public T Get(BsonValue id)
{
using (var db = new LiteRepository(LiteDbPath))
{
try
{
return db.Query<T>().SingleById(id);
}
catch (Exception ex)
{
Debug.WriteLine($"Exception when doing Get. Exception = {ex.Message}.", TypeDescriptor.GetClassName(this));
//TODO : General Error Handling
return default(T);
}
}
}
public void Add(T obj)
{
using (var db = new LiteRepository(LiteDbPath))
{
try
{
db.Insert<T>(obj);
}
catch (Exception ex)
{
Debug.WriteLine($"Exception when doing Add. Exception = {ex.Message}.", TypeDescriptor.GetClassName(this));
//TODO : General Error Handling
}
}
}
public void Delete(Guid Id)
{
using (var db = new LiteRepository(LiteDbPath))
{
try
{
var o = new BsonValue(Id);
db.Delete<T>(o);
}
catch (Exception ex)
{
Debug.WriteLine($"Exception when doing Delete. Exception = {ex.Message}.", TypeDescriptor.GetClassName(this));
//TODO : General Error Handling
}
}
}
public void Save(T obj)
{
using (var db = new LiteRepository(LiteDbPath))
{
try
{
db.Update<T>(obj);
}
catch (Exception ex)
{
Debug.WriteLine($"Exception when doing Save. Exception = {ex.Message}.", TypeDescriptor.GetClassName(this));
//TODO : General Error Handling
}
}
}
}
}
Тогда мы используем это так:
public class ZystemsViewModel : ObservableObject
{
private DataStore<Zystem> DB = DependencyService.Get<DataStore<Zystem>>();
public ZystemsViewModel()
{
MessagingCenter.Subscribe<ZystemAddViewModel, Zystem>(this, "Add", (obj, item) =>
{
var newItem = item as Zystem;
Debug.WriteLine($"Will add {newItem.Name} to local database.", TypeDescriptor.GetClassName(this));
DB.Add(newItem);
});
}
}
Это был коллега, который больше не работает здесь, кто сделал эти части. Я думаю, что причиной использования его как DependencyService
была возможность доступа к нему во всех классах, почти как в одиночку. Это, вероятно, должно быть заменено на одноэлементный класс?
Использование базы данных прекрасно работает в приложении. Но я хочу загрузить всю базу данных (файл) в Azure и не могу получить ее до byte[]
. Когда я
byte[] liteDbFile = File.ReadAllBytes(LiteDbPath);
Я получаю System.IO.IOException: Sharing violation on path
. Поскольку некоторые полагают, что это, вероятно, из-за блокировки файла, какие-либо предложения о том, как решить эту проблему?