如何从SQLite数据库返回位图

时间:2017-03-11 11:07:21

标签: c# xamarin bitmap xamarin.android sqlite.net

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

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

这是我的代码..

从网址获取图片:

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返回它。

1 个答案:

答案 0 :(得分:0)

  

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

位图无法直接存储在SQLite中。运行代码时,我得到了不支持的类型错误。在SQLite中存储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); } } 的唯一方法是在字节数组中存储和检索它。但是你可以在你的方法中包含转换过程并直接在你的Activity中传递Bitmap:

{{1}}