অ্যান্ড্রয়েডে SQLite ডেটাবেস পরিচিতি
SQLite একটি ওপেন-সোর্স SQL ডেটাবেস যা ডিভাইসে একটি টেক্সট ফাইলে ডেটা সংরক্ষণ করে। অ্যান্ড্রয়েডে বিল্ট-ইন SQLite ডেটাবেস ইমপ্লিমেন্টেশন থাকে। SQLite সমস্ত রিলেশনাল ডেটাবেস ফিচার সাপোর্ট করে। এই ডেটাবেস অ্যাক্সেস করার জন্য JDBC, ODBC এর মতো কোনো কানেকশন স্থাপন করতে হয় না।
উদাহরণ: BLOB ডেটা টাইপ ব্যবহার
এই উদাহরণে দেখানো হয়েছে কিভাবে অ্যান্ড্রয়েড SQLite-এ BLOB (Binary Large Object) ডেটা টাইপ ব্যবহার করা যায়। BLOB সাধারণত ছবি, ফাইল বা বাইনারি ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়।
ধাপ ১: নতুন প্রজেক্ট তৈরি
Android Studio-তে File → New Project নির্বাচন করে একটি নতুন প্রজেক্ট তৈরি করুন এবং প্রয়োজনীয় বিবরণ পূরণ করুন।
ধাপ ২: লেআউট ফাইল (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" />
<Button
android:id="@+id/update"
android:text="আপডেট"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/delete"
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.blobdemo;
import android.os.Bundle;
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 androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
Button save, refresh, update, delete;
EditText name, salary;
ArrayAdapter<String> arrayAdapter;
ArrayList<String> arrayList;
ListView listView;
DatabaseHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = new DatabaseHelper(this);
arrayList = helper.getAllContacts();
name = findViewById(R.id.name);
salary = findViewById(R.id.salary);
listView = findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
listView.setAdapter(arrayAdapter);
// ডিলিট বাটন
findViewById(R.id.delete).setOnClickListener(v -> {
if (helper.deleteAll()) {
Toast.makeText(this, "সকল রেকর্ড মুছে ফেলা হয়েছে", Toast.LENGTH_LONG).show();
refreshList();
} else {
Toast.makeText(this, "মুছে ফেলা যায়নি", Toast.LENGTH_LONG).show();
}
});
// আপডেট বাটন
findViewById(R.id.update).setOnClickListener(v -> {
String n = name.getText().toString().trim();
String s = salary.getText().toString().trim();
if (!n.isEmpty() && !s.isEmpty()) {
if (helper.update(n, s)) {
Toast.makeText(this, "আপডেট সফল", Toast.LENGTH_LONG).show();
refreshList();
} else {
Toast.makeText(this, "আপডেট ব্যর্থ", Toast.LENGTH_LONG).show();
}
} else {
name.setError("নাম লিখুন");
salary.setError("বেতন লিখুন");
}
});
// রিফ্রেশ বাটন
findViewById(R.id.refresh).setOnClickListener(v -> refreshList());
// সেভ বাটন
findViewById(R.id.save).setOnClickListener(v -> {
String n = name.getText().toString().trim();
String s = salary.getText().toString().trim();
if (!n.isEmpty() && !s.isEmpty()) {
if (helper.insert(n, s)) {
Toast.makeText(this, "সংরক্ষণ সফল", Toast.LENGTH_LONG).show();
refreshList();
} else {
Toast.makeText(this, "সংরক্ষণ ব্যর্থ", Toast.LENGTH_LONG).show();
}
} else {
name.setError("নাম লিখুন");
salary.setError("বেতন লিখুন");
}
});
}
private void refreshList() {
arrayList.clear();
arrayList.addAll(helper.getAllContacts());
arrayAdapter.notifyDataSetChanged();
}
}
ধাপ ৪: DatabaseHelper.java
package com.example.blobdemo;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "SalaryDatabase";
public static final String TABLE_NAME = "SalaryDetails";
public static final int VERSION = 1;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE " + TABLE_NAME +
"(id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"name TEXT, " +
"salary BLOB, " +
"datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public boolean insert(String name, String salary) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
// BLOB হিসেবে সংরক্ষণ: স্ট্রিংকে বাইট অ্যারে রূপান্তর
values.put("salary", salary.getBytes());
long result = db.insert(TABLE_NAME, null, values);
return result != -1;
}
public ArrayList<String> getAllContacts() {
ArrayList<String> list = new ArrayList<>();
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(
"SELECT id, name, salary, datetime FROM " + TABLE_NAME, null);
if (cursor.moveToFirst()) {
do {
int id = cursor.getInt(0);
String name = cursor.getString(1);
// BLOB থেকে স্ট্রিং রিকভার
byte[] blob = cursor.getBlob(2);
String salary = new String(blob);
String datetime = cursor.getString(3);
list.add(id + " : " + name + " : " + salary + " : " + datetime);
} while (cursor.moveToNext());
}
cursor.close();
return list;
}
public boolean update(String name, String salary) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("salary", salary.getBytes());
int rows = db.update(TABLE_NAME, values, "name=?", new String[]{name});
return rows > 0;
}
public boolean deleteAll() {
SQLiteDatabase db = getWritableDatabase();
int rows = db.delete(TABLE_NAME, null, null);
return rows > 0;
}
}
চলাচল ও ফলাফল
অ্যাপ্লিকেশন রান করুন। একটি অ্যান্ড্রয়েড ডিভাইস বা এমুলেটর কানেক্ট থাকলে টুলবার থেকে Run আইকনে ক্লিক করুন। ডিভাইসে অ্যাপ খুললে ইন্টারফেস দেখাবে। নাম ও বেতন লিখে Save দিন। Refresh দিলে ListView-এ ডেটা দেখাবে। এখানে বেতন BLOB ফরম্যাটে সংরক্ষিত হয়েছে।

উপরের ফলাফলে নাম টেক্সট হিসেবে এবং বেতন BLOB মান হিসেবে সংরক্ষিত হয়েছে।