【问题标题】:How to save an image in SQLite in Xamarin Forms?如何在 Xamarin Forms 中的 SQLite 中保存图像?
【发布时间】:2020-11-01 10:29:56
【问题描述】:

我有以下两种方法来处理从相机拍摄照片和从库中挑选照片。它们都是在每个方法的末尾都相似的方法,我从Stream 得到一个ImageSource,然后我将它传递到另一个页面,该页面准备好设置ImageSource 绑定。这两种方法完美地工作。现在的下一步是将图像保存在 SQLite 中,以便稍后在 ListView 中显示图像。我对 XamGods(Xamarin Pros =)的问题,2019 年在 SQLite 中保存图像的最佳方法是什么?我已经在论坛上呆了好几个小时了,但我仍然对自己想做的事情没有一个狭隘的看法。我也可以

  • 将 Stream 转换为字节数组以保存在 Sqlite 中。
  • 将 ImageSource 转换为字节数组(混乱/错误)。
  • 以某种方式检索实际选择/拍摄的图像并将其转换为字节数组到 SQLite 中

很抱歉,如果我的问题是一般性的,但 Xamarin 没有提供关于如何在 SQLite 中保存图像的明确解决方案,您只能在下面列出的论坛中找到零碎的解决方案。

提前谢谢你!

    private async Task OnAddPhotoFromCameraSelected()
    {
        Console.WriteLine("OnAddPhotoFromCameraSelected");

        var photo = await Plugin.Media.CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions() { });
        var stream = photo.GetStream();
        photo.Dispose();
        if (stream != null)
        {
            ImageSource cameraPhotoImage = ImageSource.FromStream(() => stream);
            var parms = new NavigationParameters();
            parms.Add("image", cameraPhotoImage);
            var result = await NavigationService.NavigateAsync("/AddInspectionPhotoPage?", parameters: parms);

            if (!result.Success)
            {
                throw result.Exception;
            }
        }
    }

    private async Task OnAddPhotoFromLibrarySelected()
    {
        Console.WriteLine("OnAddPhotoFromLibrarySelected");
        Stream stream = await DependencyService.Get<IPhotoPickerService>().GetImageStreamAsync();
        if (stream != null)
        {
            ImageSource selectedImage = ImageSource.FromStream(() => stream);

            var parms = new NavigationParameters();
            parms.Add("image", selectedImage);
            parms.Add("stream", stream);
            var result = await NavigationService.NavigateAsync("/AddInspectionPhotoPage?", parameters: parms);

            if (!result.Success)
            {
                throw result.Exception;
            }
        }
    }

【问题讨论】:

  • 不要。将图片保存在文件系统中,并将图片的路径保存在SQLite中。
  • SQLite 是一个轻量级的基于数据库的文件。如果您将图像存储在数据库中,它将使您的数据库操作更加轻松。正如杰森所说,将整个图像存储到数据库中并不是一个好主意。您应该使用设备的文件系统并将图像名称或完整的图像路径存储在数据库中。它会让你的 sqlite 更轻。

标签: sqlite xamarin xamarin.forms


【解决方案1】:

正如Jason所说,您可以将图像路径保存到sqlite数据库中,但是如果您仍想将byte[]保存到sqlite数据库中,则需要先将stream转换为byte[]:

 private byte[] GetImageBytes(Stream stream)
    {
        byte[] ImageBytes;
        using (var memoryStream = new System.IO.MemoryStream())
        {              
            stream.CopyTo(memoryStream);             
            ImageBytes = memoryStream.ToArray();
        }
        return ImageBytes;
    }

然后从sqlite加载byte[],转换成流。

 public Stream BytesToStream(byte[] bytes)
    {
        Stream stream = new MemoryStream(bytes);
        return stream;
    }

对于简单的示例,您可以看一下: 在 sqlite 中插入 byte[]:

 private void insertdata()
    {
        var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite1.db3");
        using (var con = new SQLiteConnection(path))
        {
            Image image = new Image();
            image.Content = ConvertStreamtoByte();
            var result = con.Insert(image);

            sl.Children.Add(new Label() { Text = result > 0 ? "insert successful insert" : "fail insert" });
        }
    }

从 sqlite 加载图片:

 private void getdata()
    {
        var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "sqlite1.db3");
        using (var con = new SQLiteConnection(path))
        {
            var image= con.Query<Image>("SELECT content FROM Image ;").FirstOrDefault();

            if(image!=null)
            {
                byte[] b = image.Content;
                Stream ms = new MemoryStream(b);
                image1.Source = ImageSource.FromStream(() => ms);                   
            }

        }
    }

型号:

public class Image
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string FileName { get; set; }   
    public byte[] Content { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2020-04-13
    • 2017-12-24
    • 2020-06-22
    相关资源
    最近更新 更多