কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েড SQLite-এ REGEXP ব্যবহার করে নির্দিষ্ট ID-এর 레코ড ফিল্টার করা

এই উদাহরণে দেখানো হয়েছে কিভাবে 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 ক্লজ ইনডেক্স ব্যবহার করতে পারে এবং আরো পঠনযোগ্য।

  1. অ্যান্ড্রয়েড SQLite-এ time() ফাংশন ব্যবহার করার পদ্ধতি

  2. অ্যান্ড্রয়েড SQLite-এ sqlite_version() ফাংশন ব্যবহার

  3. Android SQLite-এ গতকালের (Yesterday) রেকর্ড বের করার পদ্ধতি

  4. Android SQLite-এ নির্দিষ্ট তারিখের (Particular Date) রেকর্ড বের করার পদ্ধতি