قسمت های دیگر این مطلب:

از جمله مباحث بسیار مهم و حرفه‌ای که در زمینه پایگاه داده و مدیریت داده‌ها در اندروید واقعا ضروری است مبحث Data Model است. هر چند که استفاده از Data Model‌ها الزامی نیست ولی تمام برنامه‌های حرفه‌ای از مفهوم Data Model به خاطر اهمیتی که دارد بهره مند هستند.

در مفهوم Data Model سعی بر آن است که برای هر موجودیت یک کلاس ایجاد شود. مفهوم موجودیت را در مثالی که در ادامه ذکر می‌شود خواهید دید:

فرض کنید یک برنامه کتابخانه دارید که در آن ده‌ها کتاب وجود دارد. اگر از پایگاه داده استفاده کنید به احتمال زیاد جداول زیر را خواهید داشت:

  • جدول کتاب ها
  • جدول نویسندگان
  • جدول موضوعات
  • جدول کلمات کلیدی
  • جدول علاقه مندی ها

موجودیت‌هایی که می‌توان برای جداول فوق متصور شد عبارتند از:

  • Book
  • Writer
  • Category
  • Tag
  • Favorite

در مثال فوق هر موجودیت مطابق یک جدول بود در صورتی که همیشه اینگونه نیست و در مواردی ممکن است یک موجودیت تلفیقی از دو یا چند جدول باشد.

چرا از Data Model استفاده می‌کنیم؟

همانطور که در اول این مطلب گفتیم استفاده از Data Model‌ها الزامی نیست ولی استفاده از آن‌ها فواید زیر را دارد:

  • بالا رفتن امنیت اطلاعات
  • رفع عیب آسان تر
  • بروز رسانی بهتر اطلاعات
  • قابل فهم بودن منطق برنامه برای کارهای گروهی
  • و ...

Encapsulation و یا کپسوله سازی در شی گرایی

در Data Model‌ها از کپسوله سازی استفاده می‌شود. در کپسوله سازی سعی می‌شود متغیرها را از دید دیگر کلاس‌ها مخفی کنیم و با استفاده از متدهای واسط که به اصطلاح به آن‌ها Setter و Getter می‌گویند، متغیرها را مقدار دهی و یا از آن‌ها مقدار گیری کنیم.

برای مخفی کردن متغیرهای اصلی آن را از نوع Private تعریف می‌کنیم. یک نمونه کپسوله سازی ساده را در مثال زیر ببینید:

public class Posts {
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

در سطر 2 یک متغیر به نام title از نوع Private ایجاد کردیم. همانطور که در بالا گفتیم دلیل تعریف این متغیر از نوع Private این است که در دیگر کلاس‌ها غیر قابل دسترس باشد.

در سطر 4 یک متد با نام getTitle را مشاهده می‌کنید که خروجی آن از نوع String است و مقدار متغیر title را باز می‌گرداند.

در سطر 8 یک متد با نام setTitle از نوع void وجود دارد که در ورودی خود یک متغیر با نام title از نوع String دریافت می‌کند و در بدنه خود متغیر title را مقدار دهی می‌کند.

اگر توجه کرده باشید متدهای getTitle و setTitle از نوع public هستند تا از هر کجایی از برنامه قابل دسترس باشند.

در پایین قصد داریم یک Data Model کامل برای نمایش یک سری مطلب ایجاد کرده و در نمایش اطلاعات از آن استفاده کنیم. یک پکیج جدید برای Model‌ها ایجاد می‌کنیم و نام آن را ir.hitos.models انتخاب می‌کنیم.

کلاس Posts را با سورس زیر ایجاد می‌کنیم:

package ir.hitos.models;

public class Posts {
    private int id;
    private String title;
    private String intro;
    private String fullPost;
    private String date;
}

همانطور که می‌بینید موجودیت Posts چهار آیتم id برای شناسه، title برای موضوع، intro برای خلاصه مطلب، fullPost برای مطلب پست و date برای نمایش زمان انتشار پست را در خود دارد.

بر روی نام هر یک از پنج آیتم فوق کلیک کرده و Ctrl + Enter را فشار دهید. از لیست نمایش داده شده Create getter and setter را کلیک کنید تا برای هر یک از پنج آیتم یک getter و یک setter ایجاد شود. سورس کلاس Posts در پایان به شکل زیر ساخته می‌شود:

package ir.hitos.models;

public class Posts {
    private int id;
    private String title;
    private String intro;
    private String fullPost;
    private String date;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getIntro() {
        return intro;
    }

    public void setIntro(String intro) {
        this.intro = intro;
    }

    public String getFullPost() {
        return fullPost;
    }

    public void setFullPost(String fullPost) {
        this.fullPost = fullPost;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

چگونه از Data Model‌ها استفاده می‌کنیم

استفاده از Data Model‌ها بسته به نوع و مکان آن‌ها متفاوت است. مثلا می‌توان از Data Model‌ها برای ذخیره و یا بازیابی اطلاعات از پایگاه داده استفاده کرد، و یا می‌توان برای دریافت اطلاعات از سمت سرور بهره برد.

در ادامه قصد داریم یک کلاس به نام DataFakeGenerator بسازیم تا اطلاعات Fake و موقتی به منظور تست Data Model ایجاد کنیم.

این کلاس را می‌توانیم در هر نرم افزاری ایجاد کنیم تا از عملکرد نرم افزار خود اطمینان حاصل کنیم.

کلاس DataFakeGenerator را در پکیج ir.hitos.models به شکل زیر ایجاد می‌کنیم:

package ir.hitos.models;

import java.util.ArrayList;
import java.util.List;

public class DataFakeGenerator {
    public static List<Posts> getData(){
        List<Posts> posts = new ArrayList<>();
        for (int i = 0; i < 10; i++){
            Posts post= new Posts();
            post.setTitle("Title num: "+ i );
            post.setIntro("Intro num: "+ i );
            post.setFullPost("Full Post num: "+ i );
            post.setDate("Date num: "+ i);

            posts.add(post);
        }
        return posts;
    }
}

در سطر 7 یک متد با نام getData با خروجی از جنس List داریم که هر یک از آیتم هایش از نوع Posts هستند.

متد getData از نوع static است تا هر کجا خواستیم بدون نیاز به ایجاد یک نمونه از DataFakeGenerator از این متد استفاده کنیم.

در سطر 8 یک متغیر از نوع List<Posts> با نام posts ایجاد می‌کنیم.

در سطرهای 9 تا 17 یک حلقه داریم که یک شی بر اساس Posts ایجاد کرده و در نهایت با add در متغیر posts ذخیره می‌کند.

در خط 18 خروجی تابع را تولید می‌کنیم.

نکته: شاید دلیل استفاده از Data Model‌ها خیلی برایتان مشخص نباشد، ولی اصلا نگران نباشید، این مبحث را به خاطر بسپارید تا در قسمت‌های بعدی که از اهمیت بسیار بالایی بر خوردار هستند از آن‌ها استفاده کنیم.