-1

我的服务器上有图像我想下载这些图像并将它们存储在本地数据库中(使用 SQLite)然后我想在本地使用这些图像。

所以我已经将图像作为位图存储到我的 SQLite 数据库中,我需要从该数据库中检索它作为位图而不是字节。

这是我的代码..

从 url 获取图片:

private Bitmap GetImageBitmapFromUrl1(string url)
{
    Bitmap imagebitmap = null;
    using (var webClient = new WebClient())
    {
        var imageBytes = webClient.DownloadData("..." + url);
        if (imageBytes != null && imageBytes.Length > 0)
        {
            imagebitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
        }
    }
    return imagebitmap;
}

使用 SQLite 创建本地数据库:

// SQLite.. Creating database to store images 
private class MainDatabase
{
    // Constructor
    public MainDatabase()
    {
        if(!System.IO.File.Exists(folder))
        {
            var db = new SQLiteConnection(folder);
            db.CreateTable<Image>();
        }
    }

    // Create database
    string folder = System.IO.Path.Combine
            (System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
            "imagesDatabase.db");

    // Create Table
    [Table("Image")]
    public class Image
    {
        [Column("_id"), PrimaryKey , AutoIncrement]
        public int _id { set; get; }

        [Column("_image")]
        public Bitmap _image { set; get; }
        }

        //Insert data
        public void Insert(Bitmap image)
        {
            var db = new SQLiteConnection(folder);
            var imageColumn = new Image();
            imageColumn._image = image;
            db.Insert(imageColumn);

        }

        //Retrieving data

        public Bitmap GetImageById(int id)
        {
            var db = new SQLiteConnection(folder);

            var image = from p in db.Table<Image>()
                        where p._id == id
                        select p._image;

            return image; // doesn't work   
        }
    }

我想通过它的 id 返回它。

4

1 回答 1

0

所以我已经将图像作为位图存储到我的 SQLite 数据库中,我需要从该数据库中检索它作为位图而不是字节。

位图不能直接存储在 SQLite 中。运行您的代码时出现不支持的类型错误。在 SQLite 中存储的唯一方法Bitmap是在字节数组中存储和检索它。但是您可以将转换过程包装在您的方法中,并直接在您的 Activity 中传递 Bitmap:

public class MainDatabase
{
    // Constructor
    public MainDatabase()
    {
        //if (!System.IO.File.Exists(folder))
        //{
            var db = new SQLiteConnection(folder);
            db.CreateTable<Image>();
        //}
    }

    // Create database
    string folder = System.IO.Path.Combine
            (System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),
            "imagesDatabase.db");

    // Create Table
    [Table("Image")]
    public class Image
    {
        [Column("_id"), PrimaryKey, AutoIncrement]
        public int _id { set; get; }

        [Column("_image")]
        public byte[] _image { set; get; }// store the image with byte[]
    }

    public byte[] GetBitmapAsByteArray(Bitmap image)
    {
        MemoryStream stream = new MemoryStream();
        image.Compress(Bitmap.CompressFormat.Png, 0, stream);
        return stream.ToArray();
    }

    //Insert data
    public int Insert(Bitmap image)
    {
        var db = new SQLiteConnection(folder);
        var imageColumn = new Image();
        imageColumn._image = GetBitmapAsByteArray(image);
        return db.Insert(imageColumn);
    }

    //Retrieving data

    public Bitmap GetImageById(int id)
    {
        var db = new SQLiteConnection(folder);
        Image image=db.Find<Image>(id);
        // return the decoded Bitmap
        return BitmapFactory.DecodeByteArray(image._image, 0, image._image.Length);
    }
}
于 2017-03-13T09:24:28.147 回答