درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
مهدی عادلی فر
امتیاز: 159704
رتبه:6
161
198
298
1597
مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم. پروفایل کاربر

ساخت مکانیزم ذخیره سازی اطلاعات در اندروید به زبان #C

تاریخ 47 ماه قبل
نظرات 0
بازدیدها 1227
با سلام به همه دوستان و همراهان Itpro. در مطالب گذشته در باره ی خود ساختار اندروید و برنامه نویسی آن و همچنین Xamarin صحبت کردیم. حال شروع می کنیم که یک برنامه را از ابتدا بسازیم. در این مطلب به بررسی و ساخت مکانیزم ذخیره سازی اطلاعات در برنامه می پردازیم. در این مطلب خواهید دید که از همان کتابخانه های دات نت برای ذخیره سازی استفاده خواهیم کرد. راهکارهای ذخیره سازی داده به دو دسته تقسیم می شوند. وب سرویس ها و ذخیره سازی محلی. اگرچه بسیاری از برنامه های موبایل به وب سرویس ها وابسته هستند اما ما در این مطلب بر روی ذخیره سازی محلی تمرکز خواهیم داشت. راهکارهای ذخیره سازی محلی مختلفی وجود دارند. SQLite یک موتور پایگاه داده تراکنشی سبک است که در پلتفرم اندروید موجود است. SQLite به طور گسترده در موبایل ها استفاده شده است هم در اندروید و هم در IOS. اگر شما می خواهید که با بانک اطلاعاتی ارتباط داشته باشید و اطلاعات خود را در آن ذخیره کنید SQLite می تواند در موبایل راه حل خوبی باشد. اما ما در این آموزش فعلا به ذخیره سازی فایلی می پردازیم. به دو روش می توان از ذخیره سازی فایلی استفاده کرد. دو راه استانداردی که برای ذخیره سای داده های دارای ساختار در فایل متنی وجود دارد عبارتست از xml و Json. فایل های xml طولانی هستند و وب سرویس هایی که بر پایه SOAP و WSDL هستند از این استاندارد استفاده می کنند. حجم فایل هایی که به شکل json ذخیره شده اند از فایل هایی که به شکل xml ذخیره شده اند کمتر می باشد و Json در وب سرویس های RESTful کاربرد دارد. ما در این بخش از Json استفاده خواهیم کرد.

ساخت کلاس Entity


اولین کلاسی که باید آن را بسازیم، کلاسی است که فوکوس برنامه بر روی آن است. این کلاس به نوعی کلاس ساختار داده های برنامه است و entity های برنامه با این قالب ذخیره می شوند. کلاسی که در این قسمت می خواهیم بسازیم دارای فیلد های زیر است:

  • Id
  • Name
  • Description
  • Address
  • Latitude
  • Longitude

کلاس entity کلاسی است که موارد گفته شده را داشته باشد. برای ساخت این کلاس مراحل زیر را دنبال کنید:

  1. در Xamarin Studio در قسمت Solution pad بر روی نام پروژه کلیک راست کرده و گزینه New File Add| را انتخاب کنید. با انتخاب این گزینه تصویر زیر ظاهر می شود.

ساخت مکانیزم ذخیره سازی اطلاعات در اندروید به زبان #C


  1. در قسمت سمت چپ بر روی گزینه General کلیک کرده و در سمت راست بر روی گزینه Empty Class(C#) کلیک کنید.
  2. نامی برای این کلاس مشخص کنید. این نام قرار است که نام Entity های شما نیز باشد. سپس بر روی دکمه OK کلیک کنید. ما نام این فایل را ITProEntity می گذاریم.
برای این که فیلدهای مختلف کلاس Entity را بسازید باید همه آن ها را به شکل properties مشخص کنید. به کد پیاده سازی این کلاس دقت کنید.

 public class ITProEntity
    {
        public int? Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Address { get; set; }
        public double? Latitude { get; set; }
        public double? Longitude { get; set; }
    }
دقت داشته باشید که فیلد های Latitude و Longitude می توانند null باشند یعنی مقدار دهی نشوند. به همین منظور بعد از نوع داده آنها علامت ؟ استفاده شده است.

ساخت اینترفیس ذخیره سازی


برای این که عملیات ذخیره سازی را پیاده کنیم یک اینترفیس استاندارد برای آن نیاز داریم. این اینترفیس باید عملیات اساسی CRUD (Create, Read, Update, Delete) را در خود داشته باشد. همچنین می خواهیم یک مکانیزم caching ساده را نیز پیاده سازی کنیم. عملیات کشینگ باعث می شود که تعداد خواندن داده از فایل کم شده و در نتیجه سرعت و کارایی برنامه بالاتر می رود. برای ساختن اینترفیس مورد نظر از بخش Solution pad بر روی نام پروژه کلیک راست کرده و گزینه New File را انتخاب کنید. و از صفحه ظاهر شده Empty Interface را انتخاب کرده و نام آن را تعیین کنید و بر روی دکمه OK کلیک نمایید.
بعد از این که اینترفیس مورد نظر ساخته شد، متدهایی را که عمل کش کردن و CRUD را پشتیبانی کنند را در درون اینترفیس قرار می دهیم. برای کش کردن ما به یک ساختمان داده collection داریم که فقط خواندنی باشد و فقط از داخل اعمال CRUD بتوانیم عناصر آن را حذف و اضافه کنیم. برای این کار از اینترفیس IReadOnlyList استفاده می کنیم. کد اینترفیس که می سازیم به شکل زیر است:
using System.Collections.Generic;

    public interface IITProDataService
    {
        IReadOnlyList<ITProEntity> ITPros { get; }
        void RefreshCache();
        ITProEntity GetEntity(int id);
        void SaveEntity(ITProEntity entity);
        void DeleteEntity(ITProEntity entity);
    }

پیاده سازی سرویس ذخیره سازی


حال به پیاده سازی توابع موجود در اینترفیس می پردازیم. برای این کار به روش زیر عمل می کنیم.

  1. کلاسی را می سازیم و نام آن را ItproJsonService می گذاریم.
  2. مشخص می کنیم که این کلاس ، اینترفیس ساخته شده را پیاده سازی نماید.
  3. نشانگر موس را روی نام اینترفیس در کلاس قرار داده و کلیک راست کرده و از منوی باز شده گزینه ی Refactor و سپس Implement interface را انتخاب می کنیم.

اکنون در داخل کلاسی که شما ساخته بودید متدهای موجود در اینترفیس ظاهر خواهند شد. این کلاس در شکل زیر آمده است.
public class ItproJsonService : IITProDataService
    {
        public ItproJsonService()
        {
        }

        public IReadOnlyList<ITProEntity> ITPros
        {
            get { throw new NotImplementedException(); }
        }

        public void RefreshCache()
        {
            throw new NotImplementedException();
        }
        public ITProEntity GetEntity(int id)
        {
            throw new NotImplementedException();
        }
        public void SaveEntity(ITProEntity entity)
        {
            throw new NotImplementedException();
        }
        public void DeleteEntity(ITProEntity entity)
        {
            throw new NotImplementedException();
        }
       
    }
قدم بعدی نوشتن منطق متدها است. اما قبل از این که پیاده سازی این متد ها را شروع کنیم چون قرار است که از json برای ذخیره سازی استفاده کنیم پس باید کتابخانه آن را دانلود و نصب کنیم.

دانلود Json.NET


برای دانلود Json.NET برای پروژه موجود مراحل زیر را دنبال کنید.
  1. در داخل پروژه بر روی component package کلیک راست کنید و گزینه Get More Components را انتخاب کنید.
  2. در پنجره ی باز شده در قسمت جستجو عبارت json.net را وارد کنید(مانند شکل زیر)

ساخت مکانیزم ذخیره سازی اطلاعات در اندروید به زبان #C


  1. اگر ارتباط اینترنت برقرار باشد در قسمت سمت راست نتیجه جستجو ظاهر می شود. از این قسمت Json.NET را انتخاب کرده و گزینه Add to App را انتخاب کنید. با این کار کتابخانه Json.NET دانلود شده و به پروژه شما اضافه خواهد شد. بعد از دانلود شدن این کتاب خانه بر روی آن کلیک راست کرده و گزینه Edit Component را انتخاب کرده و Add to Project را انتخاب کنید. البته در نظر داشته باشید که نرم افزار xamarin قبل از انجام این مراحل از شما مشخصات حساب کاربری xamarin را می خواهد. برای حل این مشکل از پنجره ی باز شده روی لینک create account کلیک کنید و یک account بسازید و سپس به ادمه کارهای گفته شده بپردازید.

پیاده سازی متد های ItproJsonService


اکنون آماده ایم تا به ساختن متدهای موجود در کلاس بپردازیم. برنامه ما به این گونه است که فایل های متنی Json را در یک پوشه ذخیره خواهیم کرد. به گونه ای که نام هر فایل با استفاده از ID آن شخص ساخته می شود. مثل itpro<id>.json. کلاس ItproJsonService باید از محل پوشه ذخیره سازی فایل های آگاه باشد. برای سادگی این کار یک متیر خصوصی متنی تعریف می کنیم و مسیر ذخیره سازی را در آن قرار می دهیم. مسیر پوشه ذخیره سازی در زمان ساخته شدن شی از کلاس به constructor ارسال می شود. همچنین constructor باید چک کند که چنین پوشه ای وجود دارد یا خیر و اگر وجود نداشت آن را بسازد. همچنین می خواهیم در داخل برنامه مکانیزم کش را نیز داشته باشیم. برای این کار در داخل constructor متد RefreshCache() را فراخوانی می نماییم. کد زیر کد مربوط به constructor برنامه است.
 private readonly string _storagePath;

        public ItproJsonService(string storagePath)
        {
            _storagePath = storagePath;

            if (!Directory.Exists(_storagePath))
                Directory.CreateDirectory(_storagePath);
            RefreshCache();
        }

پیاده سازی caching


ما به یک Collection خصوصی برای پیاده سازی کش نیازمندیم که تابع RefreshCache() نیز برای لود کردن داده ها به داخل این Collection به کار خواهد رفت. برای این کار کد زیر را به داخل کلاس ItproJsonService اضافه کنید. این نکته را در نظر داشته باشید که در بالای این کلاس namespaceی به نام System.Collections.Generic را قرار داده باشید (using کرده باشید)
private List<ITProEntity> _entities= new List<ITProEntity>();
برای این که این لیستی که ساخته ایم به صورت فقط خواندنی باشد و در داخل برنامه نتوان مقداری به آن اضافه یا از آن کم کنیم و همانگونه که در داخل interface آورده ایم باید لیست readonly داشته باشیم کد زیر را نیز به کلاس خود اضافه خواهیم کرد.
public IReadOnlyList<ITProEntity> Entities{
get { return _entities; }
}
حال باید به پیاده سازی تابع RefreshCache() بپردازیم. همانطور که قبلا هم گقتیم این تابع مقادیر ذخیره شده را به داخل لیست ساخته شده لود می کند. این کار در زمانی که کلاس سرویس ما ساخته می شود. همچنین وقتی که تابع SaveEntity() و یا تابع DeleteEntity() ساخته می شود، کش برنامه باید تغییر نماید. ابتدا نگاهی می اندازیم به این نکته که از داخل یک فایل متنی json یک شی .NET بسازیم. برای این کار ابتدا کل فایل Json را در داخل یک متغیر string می خوانیم. سپس تابع JsonConvert.DeserializeObject<> را فراخوانی می کنیم که از داخل متن Json یک شی بسازد. کد زیر این کار را انجام می دهد.
string entityString = File.ReadAllText (filename);
ITProEntity entity= JsonConvert.DeserializeObject<ITProEntity> (entityString );
برای این که همه مقادیر را داخل کش بریزیم باید پوشه حاوی فایل های json را بگیریم و هر entity را داخل کش بریزیم. که کد زیر این عمل را نشان می دهد. که باید توجه داشت که در داخل کلاس باید از namespace به نام System.IO استفاده کنید.
 
public void RefreshCache()
{
_entities.Clear ();
			string[] filenames = Directory.GetFiles (_storagePath, "*.json");
			foreach (string filename in filenames) {
				string entityString = File.ReadAllText (filename);
				ITProEntity entity= JsonConvert.DeserializeObject<ITProEntity> (entityString )
					;
				_entities.Add (entity);
			}
}

پیاده سازی تابع SaveEntity


این تابع مقادیر entityجدید و یا موجود را ذخیره می کند. بنابراین این تابع انجام دهنده دو عدد از عملیات CRUD است. Create, update را با این تابع پیاده سازی می کنیم. در حالی که entity جدیدی داشته باشیم تابع SaveEntity باید یک Id جدید به فیلد id مربوط به entity بدهد. همانطور که قبلا هم گفتیم اگر فیلد id هر entity برابر مقدار null باشد آن entity یک entity جدید است. برای اختصاص دادن id جدید اول کش را چک می کنیم که مقداری دارد یا خیر. اگر هیچ مقداری در کش نبود به این معنی است که entity که در حال ثبت آن هستیم اولین entity برنامه است پس به id آن مقدار 1 می دهیم و در غیراینصورت به بزرگترین id موجود در کش یک مقدار اضافه کرده و برابر id جدید قرار می دهیم. کد زیر تابع GetNextId را نمایش می دهد که برای تخصیص id می باشد.
if (_entities.Count == 0)
                return 1;
			return _entities.Max(p => p.Id.Value) + 1;
برای این که نام فایل ها را با استفاده از id آنها بدست آوریم تابعی به نام GetFilename() تعریف می کنیم که یک عدد صحیح گرفته و یک رشته که همان نام فایل است را برمی گرداند. کد زیر این تابع را نشان می دهد.
private string GetFilename(int id)
{
return Path.Combine(_storagePath,"entity" + id.ToString() + ".json");
}
تابع Path.Combine را در نظر بگیرید. این تابع برای ساختن مسیر فایل استفاده می شود. این تابع اگر کاراکتر نادرستی در مسیر فایل و خود فایل وجود داشته باشد اعلام خطا می کند. حال به منطق اصلی تابع SaveEntity می پردازیم. ما در این تابع می خواهیم یک شی .NET را به یک متن Json تبدیل کنیم. این کار برعکس همان چیزی است که در تابع RefreshCache() می باشد. عملیات ذخیره سازی به این شکل است که ابتدا شی .NET را به متن Json تبدیل می کنیم. این کار توسط تابع SerializeObject انجام می شود. بعد از این کار فایل متنی را ذخیره می کنیم. قطعه کد زیر بدنه تابع SaveEntity را نمایش می دهد.
 public void SaveEntity(ITProEntity entity)
        {
			Boolean newEntity= false;
			if (!entity.Id.HasValue) {
				entity.Id = GetNextId ();
				newEntity= true;
			}
			string entityString= JsonConvert.SerializeObject (entity);
			File.WriteAllText (GetFilename (entity.Id.Value), entityString);
			// update cache if file save was successful
			if (newEntity)
				_entities.Add(entity);

        }
این تابع بعد از این که یک entity به شکل درست ذخیره شد آن را به کش برنامه اضافه خواهد کرد.

پیاده سازی تابع GetEntity


این تابع یک تابع ساده است که با وجود کش در برنامه پیاده سازی آن بسیار آسان است. کار این تابع به این شکل است که یک id می گیرد و entity متناظر آن id را برمی گرداند. این تابع این کار را با استفاده از کش انجام می دهد. که تابع زیر این کار را انجام می دهد.

public ITProEntity GetEntity(int id)
        {
            var entity = _entities.Find(p => p.Id == id);
            return entity;
        }

پیاده سازی DeleteEntity


این تابع نیز یک عدد صحیح به عنوان id گرفته و entity مورد نظر را از داخل فایل های json و همچنین از داخل کش حذف می کند. کد این تابع به این شکل است:
 public void DeleteEntity(ITProEntity entity)
        {
			File.Delete(GetFilename(entity.Id.Value));
            _entities.Remove(entity);
        }
تا این جای برنامه فقط سرویس چهار عمل اصلی CRUD را با استفاده از فایل ها نوشتیم. در ادامه به ساختن ویو ها خواهیم پرداخت که از این کلاس استفاده کند. Itpro باشید

نویسنده: مهدی عادلی فر 
منبع: انجمن تخصصی فناوری اطلاعات ایران 

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.
برچسب ها
ردیف عنوان
1 معرفی سیستم عامل اندروید
2 معرفی سیستم عامل اندروید (بخش دوم)
3 معرفی سیستم عامل اندروید (بخش سوم)
4 معرفی Xamarin.Android برای نوشتن برنامه های اندروید به زبان #C
5 شروع کار برنامه نویسی اندروید با استفاده از Xamarin
6 ساخت مکانیزم ذخیره سازی اطلاعات در اندروید به زبان #C
7 طراحی رابط کاربری اندروید با استفاده از Xamarin
8 ساخت منو صفحه اصلی در اندروید
9 نمایش اطلاعات یک Entity در برنامه اندروید(Xamarin)
10 نوشتن Save و Delete برای برنامه اندروید در Xamarin
دوره مجموعه کل دوره
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید