এই উদাহরণে দেখানো হয়েছে কিভাবে SQLite-এ REGEXP অপারেটর ব্যবহার করে নির্দিষ্ট ID প্যাটার্ন ম্যাচ করে রেকর্ড ফিল্টার করা যায়।
স্টেপ ১: নতুন প্রজেক্ট তৈরি
স্টেপ ২: res/layout/activity_main.xml
(স্ট্যান্ডার্ড লেআউট: নাম, স্যালারি ইনপুট, Save/Refresh/Update/Delete বাটন, ListView)
স্টেপ ৩: src/MainActivity.java
(স্ট্যান্ডার্ড MainActivity, DatabaseHelper ব্যবহার করে CRUD)
স্টেপ ৪: src/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 = "salaryDatabase6";
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 float, datetime default current_timestamp)"
);
} catch (SQLiteException e) { /* error handling */ }
}
@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 s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", s);
contentValues.put("salary", s1);
db.replace(CONTACTS_TABLE_NAME, null, contentValues);
return true;
}
// কী পরিবর্তন: WHERE Id regexp '1|3' দিয়ে ID 1 বা 3 ফিল্টার
public ArrayList getAllCotacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<String> array_list = new ArrayList<String>();
// CAST(salary as int) দিয়ে ফ্লোটকে ইন্ট বানানো, strftime দিয়ে ডেট ফরম্যাট
Cursor res = db.rawQuery(
"select (id ||' : '||name || ' : ' || cast(salary as int) || ' : '|| " +
"strftime('%d-%m-%Y %H:%M:%S', datetime)) as fullname from "
+ CONTACTS_TABLE_NAME + " where Id regexp '1|3'", null
);
res.moveToFirst();
while (res.isAfterLast() == false) {
if ((res != null) && (res.getCount() > 0))
array_list.add(res.getString(res.getColumnIndex("fullname")));
res.moveToNext();
}
return array_list;
}
public boolean update(String s, String s1) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("UPDATE " + CONTACTS_TABLE_NAME + " SET name = " + "'" + s + "', " + "salary = " + "'" + s1 + "'");
return true;
}
public boolean delete() {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE from " + CONTACTS_TABLE_NAME);
return true;
}
}
SQLite REGEXP অপারেটর
- SQLite-এ
REGEXPএকটি ইউজার-ডিফাইনড ফাংশন, ডিফল্টভাবে বিল্ট-ইন নয়। - অ্যান্ড্রয়েডের SQLite ইমপ্লিমেন্টেশনে
REGEXPকাজ করে (ICU লাইব্রেরি ব্যবহার করে)। - প্যাটার্ন
'1|3'মানে: ID ১ বা ৩ (Regex OR অপারেটর)। - অন্যান্য প্যাটার্ন উদাহরণ:
'^[1-5]$'- ID ১ থেকে ৫'[02468]$'- জোড় ID (শেষ ডিজিট জোড়)'1[0-9]'- ১০ থেকে ১৯
রান করা
অ্যান্ড্রয়েড ডিভাইসে রান করুন। ListView-এ শুধু ID ১ এবং ৩-এর রেকর্ডগুলো দেখাবে।
দ্রষ্টব্য
cast(salary as int)- স্যালারি ফ্লোট থাকলে ইন্টে কনভার্ট করা হয়েছে।strftime('%d-%m-%Y %H:%M:%S', datetime)- ডেট ফরম্যাট কাস্টোমাইজ।- SQLite-এ REGEXP কেস-ইনসেনসিটিভ ডিফল্টে।
- পারফরম্যান্স: বড় টেবিলে REGEXP স্লো হতে পারে, ইনডেক্স ব্যবহার করে না। WHERE IN (1,3) ফাস্টার।
বিকল্প: WHERE IN ব্যবহার করে (রিকমেন্ডেড)
Cursor res = db.rawQuery(
"select ... from " + CONTACTS_TABLE_NAME + " where Id IN (1, 3)", null
);
IN ক্লজ ইনডেক্স ব্যবহার করতে পারে এবং আরো পঠনযোগ্য।