آموزش دیتابیس Realm در اندروید
سلام دوستان امیداورم حالتان خوب باشد در این سری از آموزش برنامه نویسی اندروید به آموزش دیتابیس Realm در اندروید می پردازیم همانطور که قبلا دیتابیس Realm را معرفی کردیم دیتابیس Realm بهترین جایگزین برای دیتابیس Sqlite است در ادامه نحوه استفاده و همینطور Implement دیتابیس Realm را قرار خواهیم داد شاید وقت آن باشد که با دیتابیس Sqlite خداحافظی کرده و از دیتابیس Realm استفاده کنید با ما همراه باشید.
در صورتی که تازه با دیتابیس Realm آشنا شده اید می توانید از مطلب زیر بیشتر با آشنا شوید.
دیتابیس Realm چیست ؟
در این آموزش از سه کتاب خانه استفاده خواهیم کرد که باید آن را به پروژه خود اضافه کنید.
1 2 3 | compile 'com.android.support:recyclerview-v7:21.0.+' compile 'io.realm:realm-android:0.87.4' compile 'com.jakewharton:butterknife:7.0.1' |
بعد از این کتاب خانه های بالا را به فایل Build.gradle اضافه کردید پروژه را sync کنید.
ما یک کلاس Model درست می کنیم که شامل یک فیلد است.
پس یک فایل جاوا به نام MyBook ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 | package ir.programchi.model; import io.realm.RealmObject; import io.realm.annotations.Required; public class MyBook extends RealmObject { @Required private String title; public String getTitle() { return title; } public void setTitle(final String title) { this.title = title; } } |
در بالا کلاس getter و setter را درست کردیم در ادامه از آن استفاده خواهیم کرد.
ابتدا باید یک فرگمنت درست کنیم قبل از اینکه کد جاوا آن را قرار دهیم کد layout آن را قرار میدهیم.
پس یک فایل به نام fragment_list.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/light_yellow"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical"/> </LinearLayout> |
در کد فرگمنت ما یک Recyclerview قرار دارد که بعدا از دیتابیس آیتم ها در آن نمایش داده می شود.
کد جاوا مربوط به فرگمن بالا در زیر قرار دارد.
یک فایل جاوا به نام MyListFragment.java ایجاد کرده و کدهای زیر را در آن قرار دهید. هرچند این کدها چون که شما آداپتور را ندارید خطا خواهد داشت ولی آموزش را ادامه دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package ir.programchi; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import butterknife.Bind; import butterknife.ButterKnife; import io.realm.Realm; import pl.droidsonroids.examplerealm.R; import pl.droidsonroids.examplerealm.model.MyBook; public class MyListFragment extends Fragment { @Bind(R.id.recycler_view) RecyclerView mRecyclerView; private Realm mRealm; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRealm = Realm.getInstance(getContext()); } @Nullable @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_list, container, false); ButterKnife.bind(this, view); return view; } @Override public void onViewCreated(final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.setAdapter(new MyListAdapter(mRealm.allObjects(MyBook.class))); } @Override public void onDestroy() { super.onDestroy(); mRealm.close(); } } |
در بالا برخی از بخش ها براتون خطا دارد چون شما هنوز اداپتور را ندارید در بالا ابتدا با استفاده از butterknife ویوها را find کردیم سپس یک آداپتور سفارشی ساختیم و داده ها را از دیتابیس Realm به دست اورده و به Recyclerview فرستادیم.
یک لایه به نام item_book.xml ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 | <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text_title" android:layout_width="match_parent" android:layout_height="match_parent"/> |
کد بالا شکل ظاهری هر آیتم در RecyclerView را تعیین می کند.
باید یک کلاس آداپتور درست کنیم اگر یادتان باشد در فرگمنت اصلی خطا داشیتم.
پس یک فایل جاوای دیگر به نام MyListAdapter.java ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package ir.programchi; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import io.realm.RealmChangeListener; import io.realm.RealmResults; import pl.droidsonroids.examplerealm.R; import pl.droidsonroids.examplerealm.model.MyBook; public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder> implements RealmChangeListener { private final RealmResults<MyBook> mBooks; public MyListAdapter(RealmResults<MyBook> books) { mBooks = books; mBooks.addChangeListener(this); } @Override public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_book, parent, false); return new ViewHolder((TextView) view); } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { holder.mTextTitle.setText(mBooks.get(position).getTitle()); } @Override public int getItemCount() { return mBooks.size(); } @Override public void onChange() { notifyDataSetChanged(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView mTextTitle; public ViewHolder(final TextView textView) { super(textView); mTextTitle = textView; } } } |
در بالا یک Adapter سفارشی نوشتیم که لایه ای که در قبل این کد قرار دادیم یعنی item_book.xml را در RecyclerView ما Inflate می کند سپس آن را find کرده و از آن استفاده می شود اگر یادتان باشد یک کلاس Model ایجاد کرده بودیم Constructor ورودی ما برابر با یک نوع داده از کلاس RealmResults است .
یک لایه به نام fragment_edition.xml ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/light_green"> <EditText android:id="@+id/edit_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Write a title"/> <Button android:id="@+id/button_add" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/add"/> <Button android:id="@+id/button_remove" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/remove"/> </LinearLayout> |
کار فرگمنت بالا درج یا حذف از دیتابیس است که در آن دو دکمه یکی برای حذف و دیگری برای درج و یک Edittext برای افزودن داده استفاده می شود.
یک فرگمنت به نام MyEditionFragment.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | package ir.programchi; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import io.realm.Realm; import io.realm.RealmResults; import pl.droidsonroids.examplerealm.R; import pl.droidsonroids.examplerealm.model.MyBook; public class MyEditionFragment extends Fragment { @Bind(R.id.edit_title) EditText mEditTitle; private Realm mRealm; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRealm = Realm.getInstance(getContext()); } @Nullable @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_edition, container, false); ButterKnife.bind(this, view); return view; } @Override public void onDestroy() { super.onDestroy(); mRealm.close(); } @OnClick(R.id.button_add) public void onAddClick() { mRealm.beginTransaction(); MyBook book = mRealm.createObject(MyBook.class); book.setTitle(getTrimmedTitle()); mRealm.commitTransaction(); } @OnClick(R.id.button_remove) public void onRemoveClick() { mRealm.beginTransaction(); RealmResults<MyBook> books = mRealm.where(MyBook.class).equalTo("title", getTrimmedTitle()).findAll(); if(!books.isEmpty()) { for(int i = books.size() - 1; i >= 0; i--) { books.get(i).removeFromRealm(); } } mRealm.commitTransaction(); } private String getTrimmedTitle() { return mEditTitle.getText().toString().trim(); } } |
اگر از کدهایی مانند BindView و غیره بگذریم که قبلا آموزشش را در سایت قرار دادیم دو بخش می می ماند کد درج و حذف از دیتابیس Realm ابتدا از کلاس Model خود یک object ساختیم منظور ساخت یک Instance ساده از Model نیست بلکه ساخت یک Instance که از دیتابیس Realm برگشت داشته باشد به گونه ای نوع Objectiveی از Realm را ایجاد کردیم و سپس مقدار را به Model پاس دادیم.
برای حذف داده نیز از where استفاده کردیم و به این شکل است که اگر در Edittext مقدارد title نوشته شود تمامی داده از دیتابیس حذف می شود. در آینده شکل های مختلفی از آن را برای شما قرار میدهیم.
بعد از اینکه کدهای بالا را قرار دادید باید فرگمنت ها را لود کنید.
برای اینکار نیازمند یک اکتیویتی هستیم پس یک اکتیویتی به نام MyMainActivity.java ایجاد کنید و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package ir.programchi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import pl.droidsonroids.examplerealm.R; import pl.droidsonroids.examplerealm.ui.edition.MyEditionFragment; import pl.droidsonroids.examplerealm.ui.list.MyListFragment; public class MyMainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState == null) { getSupportFragmentManager() .beginTransaction() .add(R.id.edition_container, new MyEditionFragment()) .add(R.id.list_container, new MyListFragment()) .commit(); } } } |
کد بالا که یک فرگمنت را لود می کند و فکر نمی کنم نیازمند توضیح باشد.
و در آخر هم layout مربوط به اکتیویتی بالا همانند زیر می شود و نام آن برابر با activity_main.xml است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MyMainActivity"> <FrameLayout android:id="@+id/edition_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> <FrameLayout android:id="@+id/list_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"/> </LinearLayout> |
موفق و موید باشید.
سلام میشه ازش برای ذخیره آرایه و بازخوانیش استفاده کرد؟
سلام بله
سلام حداقل api اندروید برای راه اندازی ریلم چنده؟