![](/img/trans.png)
[英]Storing Excel/Word documents Windows Azure Blob Storage Files Corrupted
[英]Store liteDB documents in the cloud (azure) blob storage
我在我的iOS和Android应用程序中使用lightDB作为本地数据库在Xamarin Forms中实现。 我正在尝试使用Azure将我的本地liteDB存储在云中。 我们已经实现了一个REST api,它可以接收一个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
。 有些人认为这可能是由于文件被锁定,有关如何解决这个问题的任何建议?
LiteDB是普通文件数据库,没有正在运行的服务来访问数据。 如果创建REST API,则应将数据文件放在运行IIS的同一台计算机(本地磁盘)中。
Azure blob存储是另一项服务,并根据请求提供文件。
将LiteDB视为一个简单的FileStream
类(适用于本地文件),具有“超级大国” :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.