【问题标题】:Xamarin forms, how to save byte[] to SQLite database?Xamarin 表单,如何将 byte[] 保存到 SQLite 数据库?
【发布时间】:2016-07-25 05:16:25
【问题描述】:

今天我正在处理如何将字节数组保存到 SQLite 数据库的问题。当我将 base[] 保存到数据库时,看起来该属性保存了该数组,但实际上当我在设备上重新启动应用程序时它并没有保存到数据库。也许我必须先将 byte[] 转换为 base 64,然后才能将其放入数据库?如果是,我该怎么做?也可能有另一种方法保存到 sqlite 数据库,而不转换为 base64?

这是我的对象类:

public class Unit
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public bool IsStarted { get; set; }
        public byte[] CImage { get; set; }
    }

这里我从图库中选择图片并设置为可绑定值:

IGalleryImageService galleryService = Xamarin.Forms.DependencyService.Get<IGalleryImageService>();
            galleryService.ImageSelected += (o, imageSourceEventArgs) =>
            {
                ActiveP.CImageBindable = imageSourceEventArgs.ImageSource;

                MemoryStream st = new MemoryStream(imageSourceEventArgs.ImageSource);
                ImageSource imgSource = ImageSource.FromStream(() => st);
                (ActiveP.Page as PTemplate).CImage.Source = imgSource;
            };
            galleryService.SelectImage();

这是我正在更新数据库或将对象插入数据库的另一个 Unit 类:

     private void UpdateObjectToDB()
     {
        PUnit pUinit = new PUnit()
        {
            Id = this.Id,
            IsStarted = this.IsStarted,
            CImage = this.CImage 
        };
        App.database.Update(pUinit);
    }

    public int InsertObjectToDB()
    {
        PUnit pUnit = new PUnit()
        {
            IsStarted = this.IsStarted,
            CCImage = this.CImage
        };
        return App.database.AddItem(pUnit);
}

我必须在哪里转换以及如何实现?感谢您的回答或建议。

【问题讨论】:

标签: c# sqlite xamarin bytearray xamarin.forms


【解决方案1】:

好吧,我通过将此类属性更改为字符串类型解决了问题:

public class Unit
    {
        [PrimaryKey, AutoIncrement]
        public string CImageBase64 { get; set; }
    }

然后在其他单元类中我更改了可绑定数据类型:

public string CImageBindable
        {
            get
            {
                return base.CImageBase64;
            }
            set
            {
                base.CImageBase64 = value;
                OnPropertyChanged(nameof(CImageBindable));
            }
        }

在这里我转换为base 64

    if (this.P.CImageBindable == null)
    {
        CImage.Source = "img.png";
    }
    else
    {
        var imageBytes = Convert.FromBase64String(this.P.CImageBindable);

        MemoryStream st = new MemoryStream(imageBytes);
        ImageSource imgSource = ImageSource.FromStream(() => st);
        CImage.Source = imgSource;
    }

图片选择也转换了:

IGalleryImageService galleryService = Xamarin.Forms.DependencyService.Get<IGalleryImageService>();
            galleryService.ImageSelected += (o, imageSourceEventArgs) =>
            {
                ActiveParking.CImageBindable = Convert.ToBase64String(imageSourceEventArgs.ImageSource);
                MemoryStream st = new MemoryStream(imageSourceEventArgs.ImageSource);
                ImageSource imgSource = ImageSource.FromStream(() => st);
                (ActiveParking.Page as PTemplate).CImage.Source = imgSource;
            };
            galleryService.SelectImage();

【讨论】:

    【解决方案2】:

    你可以试试这个

         private void UpdateObjectToDB()
         {
            PUnit pUinit = new PUnit()
            {
                Id = this.Id,
                IsStarted = this.IsStarted,
                CImage = Encoding.ASCII.GetBytes(this.CImage) 
            };
            App.database.Update(pUinit);
        }
    
        public int InsertObjectToDB()
        {
            PUnit pUnit = new PUnit()
            {
                IsStarted = this.IsStarted,
                CCImage = Encoding.ASCII.GetBytes(this.CImage)
            };
            return App.database.AddItem(pUnit);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 2021-07-11
      • 1970-01-01
      • 2015-07-19
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多