Sample Sidebar Module

This is a sample module published to the sidebar_top position, using the -sidebar module class suffix. There is also a sidebar_bottom position below the menu.

Sample Sidebar Module

This is a sample module published to the sidebar_bottom position, using the -sidebar module class suffix. There is also a sidebar_top position below the search.
برنامه نویسی

این مطلب مناسب برنامه نویسان اندروید است. اگر با مفاهیم برنامه نویسی اندروید آشنا هستید و برنامه نویسی میکنید اما هنوز برای دیتابیس لوکال خود از SQLite استفاده میکنید این مطلب برای شما مفید است. این مطلب قصد دارد به شما با ذکر دلایلی بگوید که دیگر زمان مهاجرت به Realm فرا رسیده است و باید با SQLite خداحافظی کنید.

هنگام ایجاد یک برنامه اندروید، هر توسعه دهنده با مشکلات زیادی روبرو است. و اولین و مهمترین سؤال نحوه ذخیره اطلاعات است. برای هر توسعه دهنده اندروید بسیار مهم است که بانک اطلاعاتی مناسب را انتخاب کند که متناسب با محصول باشد.

وقتی توسعه دهندگان شروع به جستجوی بهترین بانک اطلاعاتی می کنند، می توانند مجموعه ای از راه حل ها را پیدا کنند، به ویژه هنگامی که می خواهند تمام اطلاعات مورد نیاز را روی سرور ذخیره کنند. اما هنگامی که نیاز به ذخیره داده ها در دستگاه کاربر است، دو گزینه اصلی وجود دارد که در دسترس خواهند بود. Realm و SQLite. بیایید نگاهی دقیق تر به هر دو پایگاه داده بیندازیم.

SQLite

این بانک اطلاعاتی همچنان پرکاربردترین موتور SQL DB است. این کار در سال 2000 توسط ریچارد هیپ انجام شد. SQLite در درجه اول به سمت ذخیره کلیه داده ها در دستگاه ها و دور شدن از معماری مشترک مشتری-سرور هدایت می شود. هزاران برنامه موبایل با استفاده از این ابزار ساخته شده است.

Realm

این ابزار به عنوان یک سیستم مدیریت داده قدرتمند می تواند به راحتی جایگزین SQLite شود. از طرفی Realm کاملا رایگان است و توسعه آن در سال 2010 آغاز شد و نام اول آن TightDB بود. در سال 2014 سازندگان آن، آنرا به Realm تغییر نام دادند و نسخه بتا آن را منتشر کردند. این ابزار به طور گسترده ای برای توسعه تلفن همراه مورد استفاده قرار می گیرد، این دستابیس یکپارچه با Java ، Swift ، Objective-C ، Xamarin و React Native کار می کند. درحال حاضر، این ابزار هر روز بیش از پیش محبوبیت خود را در بین توسعه دهندگان تلفن همراه کسب می کند.

بیایید اصلی ترین دلایل افزایش کاربرد و محبوبیت Realm نسبت به SQLite بررسی کنیم.

اشکالاتی در SQLite

حتی قدرتمندترین ابزارها دارای اشکالاتی هستند. در صورتی که پروژه شما چندان پیچیده نباشد ، می توانید SQLite را انتخاب کنید. این پایگاه داده کاملاً متناسب با برنامه های کوچک است. در غیر این صورت، ممکن است با چالش های زیر روبرو باشید:

مقیاس پذیری

هیچ انكاری وجود ندارد كه هر چه برنامه شما بزرگ و پیچیده تر باشد، نیاز به ذخیره بیشتر داده ها وجود دارد. اگر می خواهید برنامه شما با یک حجم گسترده از داده های یکپارچه کار کند، نوشتن یک دیتا سرویس پیچیده ضروری است. توسعه دهندگان جدید به دلیل عدم تجربه استفاده از SQL با این موضوع مشکل دارند.

ضعف دیگر مهاجرت داده ها است. اولین و مهمترین مسئله عدم امکان تغییر نام یا حذف ستون در چند سطر کد است. وقتی نیاز به مهاجرت باشد، باید چندین قدم بردارید. منظور از مهاجرت در اینجا هنگامی است که قصد ایجاد نسخه بالاتری از برنامه تان را دارید و لازم است ساختار دیتابیس را متناسب با آن تغییر دهید. این تغییرات باید هنگام آپدیت شدن برنامه در گوشی کاربر بر روی نسخه قدیمی بدون از دست رفتن اطلاعات محلی اعمال شود.

برای اینکار اغلب اینگونه عمل میشود که ابتدا یک جدول جدید بر اساس جدول قدیمی ایجاد میگردد. سپس اطلاعات را از یک جدول به صفحه دیگر کپی کرده و پس از آن وقت خلاص شدن از جدول قدیمی و تغییر نام جدید است. همچنین اگر بخواهیم محدودیت ها را اضافه یا حذف کنیم، روند کاملاً مشابه است.

امنیت

SQLite حتی با وجود روند توسعه طولانی آن، هنوز هم دارای چندین مسئله امنیتی است. از آنجایی که امنیت برای هر برنامه تلفن همراه از اهمیت زیادی برخوردار است، حتما قبل از استفاده از SQLite باید در مورد این موارد اطلاع داشته باشید.

1. بعضی اوقات پرونده های ژورنال حذف نمی شوند

پرونده های ژورنال موقت به شما امکان می دهند وقتی اشتباه پیش آمد، دوباره برگردید. به عنوان یک قاعده، آنها برای مدت معینی نگهداری می شوند و پس از انجام عملیات حذف می شوند. اما بعضی اوقات آنها باقی می مانند و ممکن است باعث مشکلات امنیتی داده شود.همچنین بخاطر داشته باشید که در مواردی این حالت باعث آسیب جبران ناپذیری به دیتابیس خواهد شد.

2. SQLite DB در یک پرونده واحد ذخیره می شود

توسعه دهندگان می توانند فایل SQLite DB را در هر کجا که می خواهند در سلسله مراتب فهرست قرار دهند که ممکن است مفید به نظر آید. اما در عمل چنین نیست، این موضوع نیاز به بحث پیچیده و کامل تری دارد که خارج از این حوصله این مطلب است.

پیچیدگی

بنابرتجربه گذشته رمزگذارهای SQL هیچ مشکلی برای حل مشکلات آینده نخواهند داشت. اما وقتی شروع به استفاده از SQLite برای توسعه برنامه های Android می کنید، استفاده از این ابزار ممکن است به کابوس تبدیل شود. ساختار گسترده و پیچیدگی SQLite توسعه دهندگان را وادار به جستجوی جایگزین ساده تری می کند که بر SQL تکیه نکند. و در اینجا Realm برای نجات آمده است.

Realm در مقابل SQLite

اکنون دیگر مشخص شده است که Realm جایگزین خوبی برای SQLite است. این ابزار توسط شرکتهای بزرگی مانند IBM ، CISCO ، Amazon ، Google و Intel استفاده می شود. توسعه دهندگان قبلاً چندین مزیت Realm نسبت به SQLite را پیدا کرده اند. در اینجا برخی نتایج مقایسه آورده شده است:

1) استفاده از کدام آسان تر است؟

از نظر سادگی Realm بسیار آسان تر است. مثالهای زیر را در نظر بگیرید. فرض کنید SQLite را برای پروژه خود انتخاب کرده اید. برای ایجاد جدول، باید خطوط زیر را به کد خود اضافه کنید:

private static final String SQL_CREATE_FAVOURITE = "CREATE TABLE " +
FavouritesDBContract.FavouritesEntry.TABLE_NAME + " (" + 
FavouritesDBContract.FavouritesEntry._ID + INTEGER_TYPE + " PRIMARY KEY AUTOINCREMENT," +
FavouritesDBContract.FavouritesEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP + 
FavouritesDBContract.FavouritesEntry.COLUMN_NAME_IMAGE_URL + TEXT_TYPE + " )";

public void onCreate(SQLiteDatabase db) {
 db.execSQL(SQL_CREATE_FAVOURITE);
}

برای ایجاد همین مورد در Realm باید از RealmObject ارث بری شود:

public class Favourites extends RealmObject{
   String title;
   String imageLink;
   @Nullable
   ImageResponse image;

   public Favourites(String title, String imageLink, @NullableImageResponse image) {
       this.title = title;
       this.imageLink = imageLink;
       this.image = image;
   }
}

حالا انجام کار دیگری را بررسی میکنیم: برای دیدن لیست نتایج نیاز به یک پرس و جو (query) است. در اینجا نحوه ظاهر کد در SQLite آورده شده است.

    @Override
    public void getFavorites(int page, GetFavouritesCallBack callback) {
        List<Favourites> favourites = new ArrayList<>();
        try {
            Cursor cursor = mDb.query(
                    FavouritesDBContract.FavouritesEntry.TABLE_NAME, null, null, null, null, null, null);
            if (cursor != null && cursor.getCount() > 0) {
                while (cursor.moveToNext()) {
                    String title = cursor.getString(cursor.getColumnIndexOrThrow(FavouritesDBContract.FavouritesEntry.COLUMN_NAME_TITLE));
                    String imagePath = cursor.getString(cursor.getColumnIndexOrThrow(FavouritesDBContract.FavouritesEntry.COLUMN_NAME_IMAGE_URL));
                    Favourites favourite = new Favourites(title, imagePath, null);
                    favourites.add(favourite);
                }
            }
        } catch (IllegalStateException e) {
            callback.onDataNotAvailable();
        }
    }

اما کد نوشته شده در Realm ساده و تمیزتر است:

public List<Favourites> getFavorites() {
        Realm realm = getRealm();
        List<Favourites> favourites = realm.where(Favourites.class).findAll();
        favourites = realm.copyFromRealm(favourites);
        realm.close();
        return favourites;
    }

در مورد تغیر دادن ساختار، پیش از این به نحوه اجرای آن با استفاده از SQLite اشاره کرده ایم. اکنون بیایید چگونگی این کار را با Realm با استفاده از این کد ببینیم:

public class FavouritesMigration implements RealmMigration {
   @Override
   public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
       RealmSchema schema = realm.getSchema();
       if (oldVersion == 1) {
           schema.get("Favourites")
                   .removeField("image");
           oldVersion++;
       }
   }
}

و البته نباید فراموش شود که در پیکربندی چند خط اضافه گردد:

private static final RealmConfiguration mConfig = new RealmConfiguration.Builder()
           .schemaVersion(FAVOURITES_SCHEMA_VERSION)
           .migration(new FavouritesMigration())
           .build();

جدا از این، سادگی اجرای Realm به روشنی دیده میشود و خواندن و اضافه کردن اشیاء به دیتابیس بسیار آسان است. علاوه بر این، لازم نیست در مورد داده های داخلی فکر کنید. درحقیقت بخش عمده کار را سازندگان Realm انجام داده اند.

2) کدامیک سریعتر است؟

وقتی در مورد سرعت نیز صحبت می کنیم، Realm از SQLite بهتر است. و این حقیقت در تحقیقات منتشر شده در وب سایت رسمی Realm مشخص است. بیان میشود که ريلم 10 برابر سریعتر از SQLite است. به عنوان مثال، Realm اجازه می دهد تا در یک ثانیه 20 هزار رکورد درج کنید. SQLite اجازه می دهد تا فقط 9 هزار پرونده درج کنید.

3) کدام ابزار مستندات بهتری دارد؟

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

4) در مورد دسترسی چطور؟

در مورد Realm، این ابزار به توسعه دهندگان اجازه می دهد تا اشیاء را کپی کنند و هنوز هم به دسترسی به پایگاه داده Realm داشته باشند. اما این پایگاه داده محدودیت های خاصی دارد. چندین پرونده به در چند پروسه موازی قابل دسترس نیستند.

5)چه ویژگی های اضافی دارند؟

درحال حاظر Realm از ویژگی های متنوعی برخوردار است که می تواند روند توسعه را تسهیل کند. به عنوان مثال ، این ابزار از فرمت فایل JSON پشتیبانی می کند. اعلان های تغییر داده به شما امکان می دهد هر تغییری در پایگاه داده خود را ردیابی کنید، و این درحالی است که پشتیبانی رمزگذاری، اطلاعات کاربر را ایمن نگه می دارد.

6)در مورد هماهنگ سازی داده ها چطور؟

Realm اطلاعات را کپی نمی کند. در عوض، این بانک اطلاعاتی روی اشیاء زنده کار می کند. نمایش داده اجازه می دهد لیستی از منابع شی را دریافت کنید. بنابراین ، روی داده های اصلی Realm کار می شود. SQLite هنگام ارسال یک پرس و جو، داده ها را از دیتابیس کپی می کند. بنابراین برای ثبت تغییرات، توسعه دهنده باید آنها را دوباره در دیتابیس بنویسد.

در حال حاضر مشخص است که چرا بیشتر توسعه دهندگان Realm را برای توسعه Android انتخاب می کنند. این ابزار توسعه سریع، می تواند توسط افراد تازه کار و متخصصان در توسعه موبایل استفاده شود.

البته سال 2017 شاهد ورود کتابخانه مداوم Room بود که در رقابت بین Realm و SQLite به یک تغییر دهنده بازی واقعی تبدیل شد.

7) Room چیست؟

این کتابخانه در Google I/O 2017 معرفی شده است. این یک لایه انتزاع از SQLite برای حل چندین مشکل این پایگاه داده است. Room اجازه می دهد تا SQLite در بعضی موارد از Realm سبقت بگیرد.

  • Room به فضای ذخیره سازی 50KB نیاز دارد در حالی که اندازه Realm می تواند به 4 مگابایت برسد. بنابراین وقتی در مورد اندازه صحبت می کنیم ، Room بسیار جلوتر است.
  • Room استفاده از کلاس LiveData را بدون تأخیر و وقفه امکان پذیر می کند.
  • مشکلات مربوط به امنیت SQLite که در بالا به آنها اشاره کردیم، حدودی توسط Room حل شد. اتاق توسعه دهندگان را قادر می سازد پسوند SQLite را پشتیبانی کنند که از رمزگذاری پشتیبانی می کند.
  • در نهایت Room مشکل مهاجرت (تغییر ساختار) را حل کرد.
  • Multithreading مسئله Realm است، در حالی که Room معمولی است.
  • در مورد شمارش methods صحبت می کنیم، Realm تقریباً از 2000 تابع استفاده می کند، در حالی که Room فقط 300 نمونه در آن دارد. یک امتیاز به Room!

جمع بندی

هر گزینه ذکر شده در بالا دارای جنبه های قوت و ضعف هستند. SQLite می تواند توسعه دهنده جدید و تازه کار را از لحاظ پیچیدگی آن بترساند، به همین دلیل مبتدیان بیشتری از Realm برای اولین پروژه های Android خود استفاده می کنند.

Realm می تواند بدون هیچ گونه تنظیمات اضافی کار کند، در حالی که SQLite ممکن است مدت زمان طولانی برای انتخاب پیکربندی مناسب برای پروژه خاص نیاز داشته باشد. اما وقتی پروژه های شما در مقیاس بزرگ پیچیده تر می شود، ممکن است استفاده از SQLite همراه با Room گزینه خوبی باشد اما بهتر است قبل از تصمیم گیری نهایی اطلاعات خود را در مورد هردو به اندازه کافی بالا ببرید تا تصمیم گیری مناسبی انجام دهید. زیرا Realm ابزارهای قدرتمندی برای مدیریت داده ها در اختیار شما میگذارد که ممکن است شما را کاملا هیجان زده کند.

بنابراین وقتی بین این دو پایگاه داده انتخاب می کنید، در درجه اول به معماری پروژه و سطح مهارت های کد نویسی خود توجه کنید. اگرچه Realm ابزارهای قوی برای ساده شدن روند توسعه برنامه در اختیار برنامه نویس قرار میدهد.

من چندی پیش یک دیتا سرویس در گیت هاب آپلود کردم که در آن برای دیتابیس لوکال از Realm استفاده شده است. اگر مایل باشید میتوانید آنرا در آدرس زیر مشاهده و بررسی کنید. همچنین همواره مشاهده نظرات شما باعث افتحار و خوشحالی من است.

https://github.com/AppAfzar/DataService-library-for-android-using-okHttp-and-Realm

نویسنده: هاشمی
یازده تیر 1399

برنامه نویسی اندروید پرواز پاراگلایدر کوهنوردی

فرم ورود

فرم ثبت نام