অ্যান্ড্রয়েডে SQLite ডাটাবেস পরিচিতি
SQLite একটি ওপেন-সোর্স SQL ডাটাবেস যা ডিভাইসে টেক্সট ফাইল আকারে ডেটা সংরক্ষণ করে। অ্যান্ড্রয়েডে বিল্ট-ইন SQLite ইমপ্লিমেন্টেশন থাকে। এটি সকল রিলেশনাল ডাটাবেস ফিচার সাপোর্ট করে। এই ডাটাবেস অ্যাক্সেস করার জন্য JDBC বা ODBC-এর মতো কোনো কানেকশন স্থাপন করতে হয় না।
উদাহরণ: WHERE ক্লজ এবং AND অপারেটর ব্যবহার করে ফিল্টারিং
এই উদাহরণে দেখানো হয়েছে কিভাবে অ্যান্ড্রয়েড SQLite-এ WHERE ক্লজ এবং AND অপারেটর ব্যবহার করে একাধিক শর্ত মিলিয়ে ডেটা ফিল্টার করা যায়।
স্টেপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project এ যান এবং প্রয়োজনীয় বিবরণ পূরণ করে একটি নতুন প্রজেক্ট তৈরি করুন।
স্টেপ ২: লেআউট XML (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:hint="নাম লিখুন"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/salary"
android:layout_width="match_parent"
android:inputType="numberDecimal"
android:hint="বেতন লিখুন"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/save"
android:text="সংরক্ষণ"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/refresh"
android:text="রিফ্রেশ"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
উপরোক্ত কোডে নাম এবং বেতনের জন্য দুটি EditText ব্যবহার করা হয়েছে। Save বাটনে ক্লিক করলে ডেটা SQLite-এ সংরক্ষণ হবে। ডেটা ইনসার্ট করার পর Refresh বাটনে ক্লিক করলে ListView আপডেট হবে।
স্টেপ ৩: MainActivity.java
package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button save, refresh;
EditText name, salary;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final DatabaseHelper helper = new DatabaseHelper(this);
final ArrayList array_list = helper.getAllContacts();
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
listView = findViewById(R.id.listView);
final ArrayAdapter arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
array_list.clear();
array_list.addAll(helper.getAllContacts());
arrayAdapter.notifyDataSetChanged();
listView.invalidateViews();
listView.refreshDrawableState();
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String nameStr = name.getText().toString().trim();
String salaryStr = salary.getText().toString().trim();
if (!nameStr.isEmpty() && !salaryStr.isEmpty()) {
if (helper.insert(nameStr, salaryStr)) {
Toast.makeText(MainActivity.this, "ইনসার্ট হয়েছে", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "ইনসার্ট হয়নি", Toast.LENGTH_LONG).show();
}
} else {
name.setError("নাম লিখুন");
salary.setError("বেতন লিখুন");
}
}
});
}
}
স্টেপ ৪: DatabaseHelper.java
package com.example.andy.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.IOException;
import java.util.ArrayList;
class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "salaryDatabase3";
public static final String CONTACTS_TABLE_NAME = "SalaryDetails";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL("create table " + CONTACTS_TABLE_NAME + "(id INTEGER PRIMARY KEY, name text, salary text)");
} catch (SQLiteException e) {
try {
throw new IOException(e);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE_NAME);
onCreate(db);
}
public boolean insert(String name, String salary) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
contentValues.put("salary", salary);
db.insert(CONTACTS_TABLE_NAME, null, contentValues);
return true;
}
// WHERE name = 'Me' AND salary = '1234567890' ব্যবহার করে ফিল্টারিং
public ArrayList getAllContacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<String> array_list = new ArrayList<String>();
// দুইটি শর্ত মিলিয়ে ফিল্টার: নাম 'Me' AND বেতন '1234567890'
Cursor res = db.rawQuery("select * from " + CONTACTS_TABLE_NAME + " WHERE name = 'Me' AND salary = '1234567890'", null);
res.moveToFirst();
while (res.isAfterLast() == false) {
array_list.add(res.getString(res.getColumnIndex("name")));
res.moveToNext();
}
return array_list;
}
}
মূল পয়েন্ট: AND অপারেটর ব্যবহার করে একাধিক শর্ত
WHERE condition1 AND condition2 AND condition3 ...
- AND: সব শর্ত সত্য হলে রেকর্ড ফেরত দেয়
- OR: যেকোনো একটি শর্ত সত্য হলে রেকর্ড ফেরত দেয়
- প্যারেন্থেসিস ব্যবহার করুন: জটিল শর্তের জন্য (condition1 AND condition2) OR condition3
বेहত্তর পদ্ধতি: প্যারামিটারাইজড কোয়েরি (সিকিউরিটি)
// ✅ সুরক্ষিত - SQL ইনজেকশন রোধ
String searchName = "Me";
String searchSalary = "1234567890";
Cursor res = db.rawQuery(
"SELECT * FROM " + CONTACTS_TABLE_NAME + " WHERE name = ? AND salary = ?",
new String[]{searchName, searchSalary}
);
// ❌ অসুরক্ষিত - স্ট্রিং কনক্যাটেনেশন
Cursor res = db.rawQuery(
"SELECT * FROM " + CONTACTS_TABLE_NAME + " WHERE name = '" + name + "' AND salary = '" + salary + "'",
null
);
WHERE ক্লজের সাধারণ অপারেটরها
| অপারেটর | বর্ণনা | উদাহরণ |
|---|---|---|
| = | সমান | name = 'John' |
| != / <> | সমান নয় | salary != 50000 |
| >, <, >=, <= | তুলনা | age > 18 |
| LIKE | প্যাটার্ন মিলান | name LIKE 'J%' |
| IN | তালিকায় আছে | dept IN ('IT', 'HR') |
| BETWEEN | রেঞ্জে আছে | salary BETWEEN 30000 AND 50000 |
| IS NULL / IS NOT NULL | NULL চেক | phone IS NULL |
অ্যাপ্লিকেশন চালানোর পদ্ধতি
- আপনার অ্যান্ড্রয়েড ডিভাইস কম্পিউটারের সাথে কানেক্ট করুন
- Android Studio-তে প্রজেক্টের এক্টিভিটি ফাইল খুলুন
- টুলবারের Run আইকনে ক্লিক করুন
- মোবাইল ডিভাইস সিলেক্ট করুন
- ডিভাইসে ডিফল্ট স্ক্রিন প্রদর্শিত হবে

উপরের ফলাফলে "Me" নাম এবং "1234567890" বেতনマイルে রেকর্ডটি লিস্টভিউতে দেখানো হচ্ছে, কারণ আমরা WHERE ক্লজে AND অপারেটর দিয়ে দুটি শর্ত মিলিয়েছি।
সারসংক্ষেপ
এই টিউটোরিয়ালে আপনি শিখেছেন কিভাবে Android SQLite-এ WHERE ক্লজ এবং AND অপারেটর ব্যবহার করে একাধিক শর্ত একসাথে প্রয়োগ করে ডেটা ফিল্টার করতে পারেন। নিরাপত্তার জন্য সবসময় প্যারামিটারাইজড কোয়েরি (placeholder ?) ব্যবহার করুন।