تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
android- how to store image in SQLite and read it
#1
بسم الله الرحمن الرحيم



في هذا المثال البسيط سنتعلم كيفية خزن صورة في قاعدة بيانات SQLite وكيفية قرائتها في تطبيق اندرويد.




خطوات عمل ذلك هي كالتالي:

1- اضافة مكتبة sqlite-net-pcl من nuget package.
Reference->Manage NuGet Packages->sqlite-net-pcl->install


2- انشاء قاعدة بيانات جدول باستخدام هذا البرنامج الخاص بالتعامل مع قاعدة بيانات SQLite يضم الحقول التالية: ProfileId, FullName, ProfileImage وهذه الاخير تكون من نوع blob لكي نخزن الصورة عله شكل bytes.

رابط تحميل برنامج sqlitebrowser:

 http://sqlitebrowser.org


ثم يتم نقل ملف قاعدة البيانات الى مجلد Assets.

3- انشاء Class يحاكي الجدول مع عناصره من حيث نوع البيانات ولا يشترط ان تكون بنفس اسم الجدول او الحقول، حيث يتم ربط الجدول بهذا الـ Class للتعامل معها.

PHP كود :
using SQLite;

namespace 
SQLiteAndImages
{
 
   [Table("ProfileTable")]
 
   internal class Profile
    
{
 
       [Column("Id"), PrimaryKeyAutoIncrement]
 
       public int Id getset; }
 
       [Column("FullName")]
 
       public string FullName getset; }
 
       [Column("ProfileImage")]
 
       public byte[] ProfileImage getset; }
 
   }


يجب عليك استخادم SQLite Attribute  لتعليم اسم الجدول وكذلك الحقول ويجب ان تكون الـ Attributes بنفس اسماء الحقول ولا يهم هنا إن كتبتها Capital or Small.

4- انشاء Class للتعامل مع العمليات على الجدول.
PHP كود :
using Android.App;

using SQLite;

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;

namespace 
SQLiteAndImages
{
 
   internal class SqliteManager
    
{
 
       const string DB_NAME "ProfileDB.db3";
 
       readonly string dbPath Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), DB_NAME);
 
       SQLiteAsyncConnection asyncConnection;

 
       public SqliteManager()
 
       {
 
           CopyDB();
 
           asyncConnection = new SQLiteAsyncConnection(dbPath);
 
       }

 
       public async Task<ProfileGetProfileAsyncById(int id)
 
       {
 
           return await asyncConnection.GetAsync<Profile>(id);
 
       }

 
       public async Task<List<Profile>> GetProfilesAsync()
 
       {
 
           return await asyncConnection.Table<Profile>().ToListAsync();
 
       }

 
       public async void InsertProfile(Profile profile)
 
       {
 
           await asyncConnection.InsertAsync(profile);
 
       }

 
       // copying data base from assets to android device
 
       private void CopyDB()
 
       {
 
           if (File.Exists(dbPath))
 
           {
 
               return;
 
           }

 
           using (var br = new BinaryReader(Application.Context.Assets.Open(DB_NAME)))
 
           {
 
               using (var bw = new BinaryWriter(new FileStream(dbPathFileMode.Create)))
 
               {
 
                   byte[] buffer = new byte[2048];
 
                   int length 0;
 
                   while ((length br.Read(buffer0buffer.Length)) > 0)
 
                   {
 
                       bw.Write(buffer0length);
 
                   }
 
               }
 
           }
 
       }
 
   }


هذا الـ Class يضم عدة دوال منها قراءة كل البيانات وقراءة سطر بالاعتماد على الـ id وايضا دالة لادخال البيانات ودالة مهمة جدا وهي دالة Copy هذه الدالة وظيفتها قراءة نسخ ملف قاعدة البيانات من مجلد Assets الى جهاز الاندرويد لان الملفات التي تخزن في الـ Assets هي ملفات ثابتة لا يمكن الكتابة عليها لذا يجب نقلها الى الجهاز لنتمكن من التعديل عليها.


5- انشاء Class باسم Converter تحوي دالة لتحويل الصورة الى bytes ودالة اخرى لتحويل الـ bytes الى صورة.
PHP كود :
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Widget;

using System.IO;
using System.Threading.Tasks;

using static Android.Graphics.Bitmap;

namespace 
SQLiteAndImages
{
 
   // this class is for converting bytes to bitmap and vice versa
 
   internal class Converter
    
{
 
       Context context;
 
       public Converter(Context context)
 
       {
 
           this.context context;
 
       }

 
       public async Task<byte[]> ImageToBytesAsync(ImageView imageView)
 
       {
 
           var bmp = (context.GetDrawable(Resource.Drawable.myImage) as BitmapDrawable).Bitmap;
 
           using (var memoryStream = new MemoryStream())
 
           {
 
               await bmp.CompressAsync(CompressFormat.Jpeg90memoryStream);
 
               return memoryStream.ToArray();
 
           }
 
       }

 
       public async Task<BitmapBytesToImageAsync(byte[] bytes)
 
       {
 
           return await BitmapFactory.DecodeByteArrayAsync(bytes0bytes.Length);
 
       }
 
   }


لاحظ استخدام await-async لانه من المحتمل ان تكون حجم الصورة كبيرة جدا لذا قد يؤثر على التطبيق لذا من الافضل استخدام هذه الطريقة لكي لا تؤثر على عمل التطبيق.

الصورة التي نقرأها موجودة داخل مجلد drawable بحيث يتم تحويلها الى Bitmap ومن ثم الى bytes.

لذا هذا مثال بسيط فمن المحتمل انك ستقرأ صورة من الانترنت او من الجهاز.



المثال تجدوه على github من الرابط التالي:





تحياتي لكم
الرد
تم الشكر بواسطة: Amir_alzubidy , elgokr , elgokr
#2
جزاك الله خير
شكراً جزيلاً
 اللهم اغفر لي و لوالديّ و للمؤمنين و المؤمنات 
و المسلمين و المسلمات الأحياء منهم و الأموات 
سبحان الله وبحمده Heart سبحان الله العظيم
الرد
تم الشكر بواسطة: Sajad , Sajad


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  how to search in ListView items _xamarin.android Sajad 1 163 23-09-18, 10:20 PM
آخر رد: خربطة
  Downloading an image from URL Sajad 0 151 06-07-18, 12:46 PM
آخر رد: Sajad
  SQLite (Insert, Delete, Update and Search)in Xamarin.Android Part2 Sajad 1 411 14-02-18, 09:52 PM
آخر رد: حريف برمجة
  SQLite in Xamarin.Android Part1 Sajad 2 497 12-02-18, 09:20 AM
آخر رد: sendbad100
  LogIn App: zip align & uploding on Goolge Store #10 Sajad 5 488 16-01-18, 01:14 PM
آخر رد: حريف برمجة
  Android App Folders Sajad 2 261 10-12-17, 12:45 AM
آخر رد: حريف برمجة

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم