অ্যান্ড্রয়েড ইন্টারমিডিয়েট টিউটোরিয়াল ১২ঃ SQLite ডাটাবেজ
কেমন আছেন ফ্রান্স? 😛 টুলবার , ন্যাভিগেশন ড্রয়ার ঠিক মত কাজ করছে তো? আজকে আমরা চলে যাবো ডাটাবেজে। ডাটাবেজের এই টিউটোরিয়াল করার জন্য আমাদের প্রি-রিকুয়েজিট হচ্ছেঃ
– SQLite সম্পর্কে জানা
– SQL ( Structured Query Language ) এর কুয়েরী লাইনগুলো জানা
সো, যাদের জানা নাই তারা প্রথমে এগুলো নিয়ে একটু পড়াশুনা করে আসি। ডাটাবেজ টিউটোরিয়াল এর জন্য অনেক্কেই বসিয়ে রেখেছি। আজকে সেই বহুল প্রতিক্ষিত দিন 😛
এসকিউএল এ মূলত আমরা চারটা জিনিস করি। এগুলোকে সংক্ষেপে বলে CRUD. ( ক্রুড ) । দি ক্রুডস মুভিটা দেখসেন? না, ওই মুভির সাথে এটা সম্পর্ক নেই, বাট মুভিটা ভালো।
C – Create
R – Read
U – Update
D – Delete
এই চারটা অপারেশন মূলত করবো আমরা। ডাটাবেজ ও টেবিল ক্রিয়েট করবো, রিড করবো, উপডেট করবো, ডিলিট করবো। এগুলো আপনার সারাজীবন লাগবে।
কি করবো আমরা?
আমরা ডাটা এড করবো, এবং তা দেখবো। আমি প্রজেক্ট অলরেডি বানিয়ে ফেলেছি, ভিডিওটা দেখি।
< সোর্সকোড ডাউনলোড করুন এখান থেকে >
কি কি লাগবে আমাদের?
১/ ডাটাবেজ হেল্পার ক্লাসঃ যেখানে ডাটাবেজের নাম, টেবিলের নাম, টেবিলের কলামের নাম, কুয়েরী ইত্যাদি থাকবে।
২/ টেমপ্লেট ক্লাসঃ এখানে কলাম অনুসারে টেবিলের ভেরিয়েবল, আর ভেরিয়েবল গুলো দিয়ে গেটার সেটার মেথড তৈরী করা হবে। গেটার সেটার সম্পর্কে আইডিয়া না থাকলে এখানে ঢু মারুন। এখানে কনস্ট্রাক্টর থাকবে বেশ কয়েকটি। দরকার মত আমরা টেনে নিয়ে ব্যবহার করবো।
৩/ মেইনএক্টিভিটি’তে ডাটাবেজ ক্লাসের অব্জেক্ট তৈরী করে ডাটা ইনসার্ট করবো এবং বের করে রিড করবো।
ডাটাবেজ কিভাবে ডিজাইন করবো?
ডাটাবেজ ডিজাইনটা করতে করতে হবে আস্তে আস্তে। যারা কম্পিউটার সায়েন্সে পড়ছেন তাদের জন্য ডাটাবেজ কোর্স রয়েছে আলাদা, ল্যাব রয়েছে। আর গুগল করে পাবেন অজস্র রিসোর্স। So? What are you waiting for?
স্টেপ ১/
প্রথমে একটা ক্লাস বানাই MyDataBaseHelper নামে যেটা কিনা extends করবে SQLiteOpenHelper কে। সো, পুরা ক্লাসটা দেখতে এমন হবে। আমি ভেতরে বাংলায় কমেন্ট করে দিচ্ছি। বুঝতে অসুবিধা হলে কমেন্ট করবেন আর্টিকেলের নিচে।
MyDataBaseHelper.java
public class MyDataBaseHelper extends SQLiteOpenHelper { // ডাটাবেজ ভার্শন private static final int DATABASE_VERSION = 1; //ডাটাবেজের নাম। একটা ডাটাবেজে অনেকগুলো টেবিল থাকতে পারে private static final String DATABASE_NAME = "MyCSEGuidDB"; // টেবিলের নাম, যেখানে ডাটা থাকবে private static final String TABLE_CSEDIC = "mycsetable"; // টেবিলে কি কি কলাম থাকবে। private static final String KEY_ID = "id"; private static final String KEY_TOPIC = "topic"; private static final String KEY_DETAILS = "details"; // কনস্ট্রাক্টর public MyDataBaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // SQLiteOpenHelper এক্সটেন্ডস করলে এই মেথড ওভাররাইড হবে। এখানে টেবিল বানানোর এসকিউএল কুয়েরি লিখতে হবে। @Override public void onCreate(SQLiteDatabase db) { // টেবিল ক্রিয়েটের কুয়েরী String creating_table = "CREATE TABLE " + TABLE_CSEDIC + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TOPIC + " TEXT," + KEY_DETAILS + " TEXT" + “)”; // নিচের মেথডে কল হলে টেবিল ক্রিয়েট হয়ে যাবে। db.execSQL(creating_table); } // এটা কাজে আসবে যদি আমরা ডাটাবেজ আপডেট করতে চাই। @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int j) { // টেবিল ডিলিট করতে দিতে sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_CSEDIC); // আবার টেবিল তৈরী করতে onCreate(sqLiteDatabase); } // নতুন ডাটা অ্যাড করতে void addNewCseTopic(CSEGuide cseGuide) { // ডাটা রাইট করবো তাই গেটরাইটেবল, যদি শুধু রিড করতাম, তাহলে রিডেবল দিতাম ভাইলোগ। SQLiteDatabase db = this.getWritableDatabase(); // This class is used to store a set of values that the ContentResolver can process. ContentValues values = new ContentValues(); values.put(KEY_TOPIC, cseGuide.getTopic()); // topic values.put(KEY_DETAILS, cseGuide.getDetails()); // details // ভ্যালুস এ ইউজার কর্তিক প্রবেশকৃত ডাটা এখানে টেবিলে প্রবেশ করাচ্ছি db.insert(TABLE_CSEDIC, null, values); db.close(); // ডাটাবেজ কানেশকন বন্ধ করে দিলাম } //টপিকটা ডাটাবেজ থেকে রিড করার জন্য মেথড public String[] getTopics(){ SQLiteDatabase db = this.getReadableDatabase(); Cursor res = db.rawQuery("select * from "+TABLE_CSEDIC+";", null); res.moveToFirst(); String[] p = new String[res.getCount()]; if(res.moveToFirst()) { int i=0; do { p[i] = res.getString(res.getColumnIndex("topic")); i = i +1; } while(res.moveToNext()); } return p; }
এখানে Cursor হচ্ছে ডাটাবেজ এর টেবল থেকে আসা ডাটা ধরবে। এ্যারে স্ট্রিং p তে টপিকওয়ালা যা ডাটা আছে তা রাখবো এবং getTopics কল হলে সেগুলো রিটার্ন করে দিবো।
res.getString(res.getColumnIndex(“topic”)); এখানে res.getString() এর ভেতরে কলামের নামটা দিলাম যে কলামের ডাটা চাই। সো, ডিটেলইস এর ডাটা আনতে পারবেন না? পারা উচিত।
res.moveToNext() প্রতি লুপে এক রো করে নিচে যায়।
res.getCount() হচ্ছে, মোট কতগুলো আইটেম আছে তা রিটার্ন করে।
স্টেপ ২/
CSEGuide নামে আমরা একটা ক্লাস বানাই। যেটা দেখতে নিচের মত হবে।
public class CSEGuide { //private variables int _id; String _topic; String _detals; // Empty constructor public CSEGuide(){} // constructor public CSEGuide(int id, String topic, String details){ this._id = id; this._topic = topic; this._detals = details; } // constructor public CSEGuide(String topic, String details){ this._topic = topic; this._detals = details; } // getting ID public int getID(){ return this._id; } // setting id public void setID(int id){ this._id = id; } // getting topic public String getTopic(){ return this._topic; } // setting topic public void setTopic(String name){ this._topic = name; } // getting details public String getDetails(){ return this._detals; } // setting details public void setDetails(String details){ this._detals = details; } }
স্টেপ ৩/
ডাটা ইনসার্ট করানোর জন্য এক্সএমএল ফাইল। ইউজার এর কাছ থেকে EditText দিয়ে ডাটা নিলাম। সো, আমার activity_main.xml টা দেখতে এমন হবেঃ
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margin="20dp"> <EditText android:id="@+id/topicxml" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter Topic Name" /> <EditText android:id="@+id/detailsxml" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter Topic Details" android:layout_marginTop="5dp"/> <Button android:id="@+id/addingdata" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Add to Database" android:onClick="oYe" android:layout_marginTop="15dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="10dp"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="Seach Topic Wise"/> <Button android:id="@+id/searchdata" android:layout_width="wrap_content" android:layout_height="match_parent" android:text="Go" android:padding="8dp" /> </LinearLayout> <ListView android:id="@+id/listfromxml" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="5dp"></ListView> </LinearLayout>
স্টেপ ৪/
MainActivity.java তে আমরা লিস্টভিউ’তে অ্যাড করা ডাটা দেখাবো। ক্লাসটা দেখতে এমন হবেঃ
public class MainActivity extends AppCompatActivity { ListView lv; EditText ed_topic, ed_details; String [] x; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.listfromxml); ed_topic = (EditText) findViewById(R.id.topicxml); ed_details = (EditText) findViewById(R.id.detailsxml); // অবজেক্ট ক্রিয়েট করে টপিক্সগুলোর জন্য মেথড কল করে টপিক্সগুলো এনে x এ রাখলাম। final MyDataBaseHelper mydbh = new MyDataBaseHelper(this); x = mydbh.getTopics(); // লিস্টভিউতে টপিকগুলো দেখালাম। লিস্টভিউ না বুঝলে লিস্টভিউ টিউটোরিয়াল দেখুন <a href="https://www.youtube.com/user/rubel007cse" target="_blank">youtube.com/rube007cse</a> এখানে ArrayAdapter ad = new ArrayAdapter(this, android.R.layout.simple_list_item_1, x); lv.setAdapter(ad); } // ডাটা এড করার জন্য মেথড। অনক্লিক লিসেনার না বুঝলে লিস্টভিউ টিউটোরিয়াল দেখুন <a href="https://www.youtube.com/user/rubel007cse" target="_blank">youtube.com/rube007cse</a> এখানে। public void oYe (View v) { MyDataBaseHelper mydbh = new MyDataBaseHelper(this); mydbh.addNewCseTopic(new CSEGuide(ed_topic.getText().toString(), ed_details.getText().toString())); Toast.makeText(getApplicationContext(),"Added", Toast.LENGTH_LONG).show(); } }
আরো দুইটা কাজ বাকি আছে, আপডেট, ডিলিট। ওইগুলো আপনাদের জন্য রেখে দিলাম। করে জানালে খুশি হব। এই টিউটোরিয়াল ভালো লাগলে শেয়ার করতে পারেন। ছড়িয়ে দিন যা কিছু ভালো। youtube.com/rube007cse এখানে সাবস্ক্রাইব করুন ভিডিওর জন্য। রেগুলার টিউটোরিয়াল পেতে ফেসবুকে আমার সাথে যুক্ত থাকতে পারেন এখান থেকে।
ভালো থাকেন, সুস্থ থাকেন, ভালো অ্যাপ তৈরী করুন।