繁体   English   中英

将liteDB文档存储在云(azure)blob存储中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM