ডেটা পার্সিস্টেন্স মোবাইল অ্যাপ্লিকেশনের সেশনগুলির মধ্যে ব্যবহারকারীর তথ্য সংরক্ষণ নিশ্চিত করে। এই প্রযুক্তি ছাড়া, প্রতিটি লঞ্চ শুন্য থেকে শুরু হবে — সেটিংস, ইতিহাস এবং ডাউনলোড করা ফাইলগুলি বন্ধ হলে হারিয়ে যাবে। Google Developers, 2024 অনুযায়ী, 90% এর বেশি মোবাইল অ্যাপ্লিকেশন ব্যবহারকারীর ডেটা এবং ইন্টারফেস অবস্থা সংরক্ষণের জন্য অন্তত একটি পার্সিস্টেন্স প্রক্রিয়া ব্যবহার করে।
মূখ্য বিষয়সমূহ
Data Persistence হল ডিভাইসের অস্থায়ী মেমরিতে ডেটা সংরক্ষণের একটি অ্যাপ্লিকেশনের ক্ষমতা। মোবাইল ডেভেলপমেন্টে, পার্সিস্টেন্স ডেটাবেস, ফাইল সিস্টম, সেটিংস এবং ক্যাচ অন্তর্ভুক্ত করে। প্রতিটি প্রক্রিয়ার কার্যদক্ষতা, নিরাপত্তা এবং সংরক্ষণ ক্ষমতার দিক থেকে নিজস্ব বৈশিষ্ট্য রয়েছে।
অস্থায়ী ডেটা শুধুমাত্র RAM এ বিদ্যমান থাকে এবং প্রক্রিয়া শেষ হলে হারিয়ে যায়। এর মধ্যে রয়েছে স্ক্রিন অবস্থা, অস্থায়ী গণনা এবং ইমেজ ক্যাচ। স্থায়ী ডেটা ফাইল সিস্টম বা ডেটাবেসে লেখা হয় এবং অ্যাপ্লিকেশন পুনরারম্ভের পরেও উপলব্ধ থাকে। এর মধ্যে রয়েছে ব্যবহারকারী সেটিংস, প্রাথমিকতা টোকন, কার্যকলাপের ইতিহাস এবং ডাউনলোড করা কন্টেন্ট।
সংরক্ষণ পদ্ধতি বাছার সময়, ডেভেলপাররা বেশ কিছু ফাক্টর মূল্যায়ন করেন। ডেটা ধরন সংরক্ষণ গঠন নির্ধারণ করে: সহজ সেটিংস — SharedPreferences বা DataStore, গঠনবদ্ধ রিকর্ড — SQLite বা Room, ফাইল — File Storage। ডেটা পরিমাণ কার্যদক্ষতাকে প্রভাবিত করে: ডেটাবেস হাজার রিকর্ডের জন্য অপ্টিমাইজড, যখন ফাইল বড় বাইনারি অবজেক্টের জন্য উপযুক্ত। নিরাপত্তার জন্য EncryptedSharedPreferences বা SQLCipher এর মাধ্যমে সংবেদনশীল তথ্য এনক্রিপ্ট করা প্রয়োজন।
data class StorageOption(
name: String,
dataType: StorageType,
capacity: Long,
secure: Boolean
)
enum class StorageType {
KEY_VALUE,
RELATIONAL,
FILE
}
SharedPreferences হল Android এ কী-ভ্যালু যুগল সংরক্ষণের ক্লাসিক উপায়। এই API প্লেটফর্মের প্রাথমিক সংস্করণ থেকে উপলব্ধ এবং প্রাইমিটিভ ধরনগুলিকে সমর্থন করে: স্ট্রিং, সংখ্যা এবং বুলিয়ান মান। ডেটা অ্যাপ্লিকেশনের প্রাইভেট ডিরেক্টরিতে XML ফাইলে সংরক্ষিত হয় এবং শুধুমাত্র এর প্রক্রিয়ার জন্য উপলব্ধ।
Jetpack DataStore হল Kotlin Coroutines এবং Flow এর উপর নির্মিত SharedPreferences এর একটি আধুনিক বিকল্প। DataStore দুটি বিকল্প অফার করে: সহজ মানের জন্য Preferences DataStore এবং টাইপকৃত অবজেক্টের জন্য Proto DataStore। SharedPreferences এর বিপরীতে, DataStore সমসাময়িক প্রবেশাধিকারে ডেটা সংগতিতা নিশ্চিত করে এবং মূল থ্রেড অবরুদ্ধ না করে অসিংক্রনাস কাজ সমর্থন করে।
// SharedPreferences — প্রথাগত পদ্ধতি
val prefs = context
.getSharedPreferences("settings", Context.MODE_PRIVATE)
with (prefs.edit()) {
putString("username", "john_doe")
putInt("score", 1500)
apply()
}
// DataStore — অসিংক্রনাস পদ্ধতি
val settingsDataStore = context
.createDataStore("settings.pb")
val usernameFlow: Flow<String> = settingsDataStore
.data
.map { it[USERNAME_KEY] ?: "" }
iOS এ, SharedPreferences এর সমতুল্য হল UserDefaults — Property List ফরম্যাটে সহজ মান সংরক্ষণের একটি ব্যবস্থা। UserDefaults সিংক্রনাস প্রবেশ ব্যবহার করে এবং অল্প পরিমাণ কানফিগরেশন ডেটার জন্য উপযুক্ত, কিন্তু সংবেদনশীল তথ্য সংরক্ষণের জন্য সুপারিশ করা হয় না।
SQLite হল একটি এম্বেডেড রিলেশনাল ডেটাবেস যা আলাদা সার্ভার ছাড়াই অ্যাপ্লিকেশন প্রক্রিয়ার মধ্যে চালে। এটি মোবাইল ডেভেলপমেন্টে সবচেয়ে ব্যাপক DBMS: এটি উভয় প্লেটফর্মে ডিফল্ট হিসেবে ব্যবহৃত হয়। Android SDK এ SQLite অন্তর্ভুক্ত করে, এবং iOS এটি libsqlite3 লাইব্রেরিতে অন্তর্ভুক্ত করে। SQLite স্ট্যান্ডার্ড SQL, লেনদেন, ইনডেক্স এবং ট্রিগার সমর্থন করে।
SQLite এর সাথে কাজ ডেটাবেস স্কিমা সংজ্ঞায়িত করা দিয়ে শুরু হয়। ডেভেলপার টেবিল, তাদের ফিল্ড এবং ধরন সংজ্ঞায়িত করে, তারপর ইনসার্ট, রিড, আপডেট এবং ডিলিট কাজ সম্পাদন করে। Android এ SQLiteOpenHelper ডেটাবেস তৈরি এবং মাইগ্রেশন পরিচালনা করে, যখন iOS C ইন্টারফেস বা FMDB র্যাপার ব্যবহার করে।
// Android এ SQLiteOpenHelper
class DBHelper(context: Context) :
SQLiteOpenHelper(context, "app.db", null, 1) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)
""")
}
fun insertUser(name: String, email: String) {
val db = writableDatabase
val values = ContentValues().apply {
put("name", name)
put("email", email)
}
db.insert("users", null, values)
}
}
| ডেটা ধরন | SharedPreferences | SQLite | ফাইল সিস্টম |
|---|---|---|---|
| ধরন | কী-ভ্যালু | রিলেশনাল DB | বাইনারি ফাইল |
| পরিমাণ | শতাধিক রিকর্ড | হাজার রিকর্ড | উপলব্ধ স্থান |
| কার্যদক্ষতা | উচ্চ | মধ্যম | আয়তনের উপর নির্ভর |
| সাধারণ ব্যবহার | সেটিংস | গঠনবদ্ধ ডেটা | ছবি, ভিডিও |
Room হল Jetpack এর একটি লাইব্রেরি যা SQLite এর উপর ORM স্তর প্রদান করে। Room SQL ক্যোরি এবং ContentValues লেখার পুনরাবৃত্তিমূলক কাজ দূর করে, সেগুলিকে অ্যানোটেশন এবং Kotlin ফাংশন দিয়ে প্রতিস্থাপন করে। Room কম্পাইলার বিল্ড টাইমে DAO (Data Access Object) বাস্তবায়ন জেনারেট করে, যা SQL সিনট্যাক্স ত্রুটিগুলি দূর করে।
Room সংযুক্ত করতে, আপনাকে kapt ডিপেন্ডেন্সি যোগ করতে হবে এবং এন্টিটি ক্লাস, DAO ইন্টারফেস এবং ডেটাবেস ক্লাস অ্যানোটেট করতে হবে। RoomDatabase প্রবেশ বিন্দু হিসেবে কাজ করে: এর মাধ্যমে DAO প্রাপ্ত করা হয় এবং ডেটাবেস কাজ সম্পাদন করা হয়। Room রিএক্টিভ ক্যোরির জন্য Flow, স্কিমা মাইগ্রেশন এবং কম্পাইল-টাইম ক্যোরি যাচাই সমর্থন করে।
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "full_name") val name: String,
@ColumnInfo val email: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAll(): Flow<List<User>>
@Insert
suspend fun insert(user: User)
@Delete
suspend fun delete(user: User)
}
@Database(
entities = [User::class],
version = 1
)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Core Data হল অবজেক্ট গ্রাফ পরিচালনা এবং ডিস্কে সংরক্ষণের জন্য Apple ফ্রেমওয়ার্ক। Room এর বিপরীতে, Core Data টেবিল না বরং পরিচালিত অবজেক্ট (NSManagedObject) নিয়ে কাজ করে যা সম্পর্কের একটি সড়ি গঠন করে। Core Data অলস লোডিং, পরিবর্তন পূর্বকারী অবস্থায় ফিরে যাওয়া এবং NSFetchRequest এর মাধ্যমে জটিল ক্যোরি সমর্থন করে।
Core Data এর মূল তিনটি উপাদান নিয়ে গঠিত: একটি পরিচালিত অবজেক্ট কন্টেক্সট (NSManagedObjectContext), একটি পার্সিস্টেন্ট স্টোর কোর্ডিনেটর (NSPersistentStoreCoordinator) এবং একটি ডেটা মডেল (NSManagedObjectModel)। NSPersistentContainer সব উপাদানকে একটি একক প্রবেশ বিন্দুতে সংযুক্ত করে, আধুনিক Swift অ্যাপ্লিকেশনের জন্য সেটআপ সহজ করে।
import CoreData
class PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "AppModel")
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Failed: \(error)")
}
}
}
func saveUser(name: String, email: String) {
let context = container.viewContext
let user = User(context: context)
user.name = name
user.email = email
do {
try context.save()
} catch let error {
print("Save error: \(error)")
}
}
}
ফাইল স্টোরেজ (File Storage) ছবি, ভিডিও এবং ডকুমেন্ট সংরক্ষণের জন্য ব্যবহৃত হয়। Android অন্তরিক স্টোরেজ (context.filesDir) — অ্যাপ্লিকেশনের জন্য প্রাইভেট, এবং বাহ্যিক স্টোরেজ (Environment.getExternalStorageDirectory) — অন্য অ্যাপ্লিকেশনের জন্য উপলব্ধ প্রদান করে। iOS এ, ফাইলগুলি Documents এবং Library ডিরেক্টরিতে সংরক্ষিত হয়, যেখানে Library/Caches সেই ক্যাচের জন্য যা iCloud এ ব্যাকआপ হয় না। ফাইল কাজের জন্য, উভয় প্লেটফর্ম File API এবং স্ট্রিমিং রিড/রাইট কাজ প্রদান করে। Coil এবং SDWebImage এর মতো আধুনিক লাইব্রেরিগুলি সর্বোত্তম কার্যদক্ষতার জন্য ফাইল স্টোরেজকে RAM এর সাথে সংযুক্ত করে একটি ক্যাচিং স্তর যোগ করে।
Android এ, জটিলতা এবং কার্যকারিতায় Core Data এর বিকল্প হল Realm, একটি অবজেক্ট ডেটাবেস যা SQL স্তর ছাড়াই সরাসরি মডেল নিয়ে কাজ করে। Realm পড়ার কাজে SQLite এর চেয়ে দ্রুত এবং লাইভ অবজেক্ট সমর্থন করে যা ডেটা পরিবর্তনের সময় স্বচালিতভাবে UI আপডেট করে।
সাধারণ প্রশ্নাবলী
Data Persistence ডিভাইসের অস্থায়ী মেমরিতে ডেটা সংরক্ষণের প্রক্রিয়াকে বোঝায়, যা অ্যাপ্লিকেশন পুনরারম্ভের পরেও তাদের প্রাপ্যতা নিশ্চিত করে। এর মধ্যে রয়েছে ডেটাবেস, ফাইল স্টোরেজ এবং সেটিংস ব্যবস্থা।
Room হল SQLite এর উপর একটি ORM আবরণ যা ম্যানুয়াল SQL ক্যোরি লেখা এবং ContentValues দূর করে। Room কম্পাইল টাইমে SQL ক্যোরি যাচাই করে, Kotlin Coroutines এবং Flow সমর্থন করে, এবং স্বচালিতভাবে ডেটা অ্যাক্সেস কোড জেনারেট করে।
SharedPreferences অল্প পরিমাণের সহজ ডেটা সংরক্ষণের জন্য উপযুক্ত: অ্যাপ্লিকেশন সেটিংস, ফ্ল্যাগ, আইডেন্টিফায়ার এবং ব্যবহারকারী পছন্দ। জটিল বা গঠনবদ্ধ ডেটার জন্য, Room বা DataStore ব্যবহার করা ভালো।
Core Data হল অবজেক্ট গ্রাফ পরিচালনার Apple ফ্রেমওয়ার্ক। এটি পরিচালিত অবজেক্ট, পরিবর্তন ট্রেকিং, অলস লোডিং এবং একটি স্টোরে (SQLite, XML বা বাইনারি ফরম্যাট) এ স্বচালিত পার্সিস্টেন্স প্রদান করে।
পছন্দ ডেটার জটিলতার উপর নির্ভর করে: সেটিংসের জন্য — DataStore বা UserDefaults, গঠনবদ্ধ রিকর্ডের জন্য — Room (Android) বা Core Data (iOS), ফাইলের জন্য — File Storage। মানদণ্ডের মধ্যে রয়েছে ডেটা পরিমাণ, কার্যদক্ষতার প্রয়োজনীয়তা এবং এনক্রিপশনের প্রয়োজন। একটি অ্যাপ্লিকেশনে একাধিক প্রক্রিয়া সংযুক্ত করা একটি স্ট্যান্ডার্ড অভ্যাস, যা প্রতিটি পদ্ধতির শক্তি সর্বোত্তমভাবে ব্যবহার করতে দেয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন