Храните документы liteDB в облачном (лазурном) хранилище больших двоичных объектов - PullRequest
0 голосов
/ 09 мая 2019

Я использую 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. Поскольку некоторые полагают, что это, вероятно, из-за блокировки файла, какие-либо предложения о том, как решить эту проблему?

1 Ответ

0 голосов
/ 09 мая 2019

LiteDB - это обычная файловая база данных, в которой нет службы доступа к данным.Если вы создаете REST API, вы должны найти свой файл данных на том же компьютере (локальном диске), на котором работает IIS.

Хранилище BLOB-объектов Azure - это еще одна служба, и файл доставляется как запрос.

ПодумайтеLiteDB как простой FileStream класс (который работает с локальным файлом) с "super-powers" :)

...