নমস্কার সবাই! এই আর্টিকেলে আমরা শিখব কিভাবে একটি iOS অ্যাপে রিয়েল্ম ডেটাবেস যোগ করতে হয়।
আমরা একটি সাধারণ ToDo অ্যাপ তৈরি করব যাতে আপনি রিয়েল্ম ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশনগুলি কীভাবে সম্পাদন করতে হয় তা শিখতে পারেন।
রিয়েল্ম কী?
রিয়েল্ম একটি ওপেন-সোর্স মোবাইল ডেটাবেস যা ডেভেলপার-বান্ধব এবং ব্যবহার করা সহজ। আপনি iOS অ্যাপে Core Data-এর বিকল্প হিসেবে এটি ব্যবহার করতে পারেন।
রিয়েল্ম একটি ক্রস-প্ল্যাটফর্ম মোবাইল ডেটাবেস, অর্থাৎ আপনি এটি নেটিভ Android এবং iOS অ্যাপের পাশাপাশি React Native-এর মতো ক্রস-প্ল্যাটফর্ম অ্যাপগুলোর জন্যও ব্যবহার করতে পারেন। এটি Objective-C, Swift, Java, Kotlin, C#, এবং JavaScript সাপোর্ট করে।
আপনার iOS প্রোজেক্টে রিয়েল্ম সেট আপ করা
আমরা SPM (Swift Package Manager), CocoaPods, বা Carthage ব্যবহার করে আমাদের iOS প্রোজেক্টে রিয়েল্ম যোগ করতে পারি। এখানে আমরা CocoaPods ব্যবহার করে আমাদের iOS প্রোজেক্টে রিয়েল্ম পড যোগ করব।
- Xcode খুলুন এবং Core Data ছাড়া UIKit এবং Swift-এ একটি ব্ল্যাঙ্ক iOS অ্যাপ প্রোজেক্ট তৈরি করুন।
- এখন Xcode বন্ধ করুন এবং টার্মিনাল খুলুন। টার্মিনাল ব্যবহার করে আপনার প্রোজেক্ট ডিরেক্টরিতে নেভিগেট করুন।
- পোডফাইল তৈরি করতে নিচের কমান্ডটি রান করুন।
pod init
৪. এখন ডিরেক্টরির কন্টেন্ট লিস্ট করলে আপনি দেখবেন একটি নতুন Podfile তৈরি হয়েছে। যেকোনো টেক্সট এডিটর ব্যবহার করে ফাইলটি খুলুন (এখানে আমি Vim ব্যবহার করেছি)। নিচের ছবির মতো দেখানোর জন্য আপনার Podfile এডিট করুন। সেভ করে Podfile বন্ধ করুন।
এখন যেহেতু আমরা রিয়েল্ম DB-এর জন্য ডিপেন্ডেন্সি নির্দিষ্ট করেছি, নিচের কমান্ড রান করে ডিপেন্ডেন্সিগুলো ইনস্টল করতে পারি:
pod install
আপনি দেখতে পাচ্ছেন, আমরা সফলভাবে আমাদের iOS প্রোজেক্টে রিয়েল্ম DB ডিপেন্ডেন্সি যোগ করেছি। এখন আমাদের প্রোজেক্টটি Xcode-এ খুলতে নিচের কমান্ডটি রান করুন।
open YOUR_APP_NAME.xcworkspace
নোট: Xcode খোলার পর, Command+B চাপে আপনার প্রোজেক্টটি বিল্ড করতে ভুলবেন না।
রিয়েল্মে আপনার ইউজার ইন্টারফেস ডিজাইন করা
আমরা আমাদের অ্যাপের UI সাদা রাখব। Main.storyboard খুলুন এবং নিচের ছবির মতো একটি টেবিল ভিউ সাথে একটি প্রোটোটাইপ সেল যোগ করে একটি সাধারণ UI তৈরি করুন। তারপর একটি নেভিগেশন কন্ট্রোলার এমবেড করুন এবং ViewController.swift ফাইলে টেবিল ভিউর জন্য IBOutlets তৈরি করুন:
রিয়েল্মে ডেটা মডেল তৈরি করা
আমাদের ToDo অ্যাপে, প্রতিটি টাস্কের একটি টাস্ক নাম এবং একটি টাস্ক আইডি থাকে। আমরা ToDo টাস্ককে প্রতিনিধিত্ব করার জন্য একটি মডেল ক্লাস তৈরি করব। প্রোজেক্ট নেভিগেটরে রাইট-ক্লিক করে একটি নতুন সুইফ্ট ফাইল তৈরি করুন এবং নিচের কোডটি যোগ করুন।
import Foundation
import RealmSwift
class ToDoTask: Object {
@objc dynamic var tasknote: String?
@objc dynamic var taskid: String?
}
এখানে আমরা ToDoTask নামে আমাদের মডেল ক্লাসটি তৈরি করেছি। এটি Object ক্লাস থেকে ইনহেরিট করে যা রিয়েল্ম DB-এর সাথে আসে। এই ক্লাসটি এই মডেল ক্লাস ব্যবহার করে তৈরি করা ডেটা ডেটাবেসে সংরক্ষণ করার সমস্ত আন্ডার-দ-হুড প্রক্রিয়া হ্যান্ডেল করে।
আমরা দুটি প্রপার্টি যোগ করেছি: tasknote, যা করা টাস্ক, এবং taskid — উভয়ই স্ট্রিং টাইপের। @objc মানে আপনার সুইফ্ট কোড Objective-C-তে দৃশ্যমান এবং dynamic মানে আপনি Objective-C ডাইনামিক ডিসপ্যাচ ব্যবহার করতে চান।
বেসিক CRUD অ্যাপ ফাংশন
আমাদের অ্যাপ নিম্নলিখিত ফাংশনগুলো সম্পাদন করবে:
- AlertViewController ব্যবহার করে ইউজার থেকে ইনপুট নেওয়া।
- ইনপুটটি ডেটাবেসে এবং টেবিল ভিউয়েও যোগ করা।
- ইউজারকে তাদের ইনপুট এডিট করার অনুমতি দেওয়া।
- সোয়াইপ টু ডিলিট করে সারি মুছে ফেলা, যা টেবিল ভিউ এবং ডেটাবেস উভয় থেকেই ডেটা সরিয়ে দেবে।
- ডেটাবেস থেকে সমস্ত ডেটা (যদি থাকে) ফেচ করে টেবিল ভিউতে প্রদর্শন করা।
AlertViewController ব্যবহার করে ইউজার থেকে ইনপুট নেওয়া
ViewController.swift খুলুন এবং viewDidLoad() মেথডের ভিতরে নিচের কোডটি যোগ করুন। এবং addTask() নামে একটি নতুন ফাংশন তৈরি করুন এবং ইউজার থেকে ইনপুট নেওয়ার জন্য একটি টেক্সট বক্স সহ অ্যালার্ট ভিউ কন্ট্রোলার প্রদর্শন করার কোড যোগ করুন।
এখন যখন রাইট বার বাটনটি প্রেস করা হবে, এটি addTask() ফাংশনটি কল করবে যা একটি টেক্সট ফিল্ড সহ alertViewController প্রদর্শন করবে যেন ইউজার ইনপুট নেওয়া যায়।
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .add, style: .done, target: self, action: #selector(addTask))
navigationController?.navigationBar.prefersLargeTitles = true
title = "RealmDB"
@objc func addTask() {
let ac = UIAlertController(title: "Add Note", message: nil, preferredStyle: .alert)
ac.addTextField(configurationHandler: nil)
ac.addAction(UIAlertAction(title: "Add", style: .default, handler: { _ in
if let text = ac.textFields?.first?.text {
print(text)
}
}))
ac.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
present(ac, animated: true, completion: nil)
}
ইনপুটটি ডেটাবেস এবং টেবিল ভিউতে যোগ করা
রিয়েল্মে ডেটা সংরক্ষণ করতে, প্রথমে আমাদের রিয়েল্মের একটি ইনস্ট্যান্স প্রাপ্ত করতে হবে যার মাধ্যমে আমরা CRUD অপারেশনের জন্য সমস্ত মেথড অ্যাক্সেস করতে পারব। ViewController.swift ফাইলে Realm টাইপের একটি প্রপার্টি তৈরি করুন এবং এটি viewDidLoad() মেথডে ইনিশিয়ালাইজ করুন।
var realmDB: Realm!
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(image: .add, style: .done, target: self, action: #selector(addTask))
navigationController?.navigationBar.prefersLargeTitles = true
title = "RealmDB"
realmDB = try! Realm()
}
আমাদের ডেটা মডেল (ToDoTask) টাইপের একটি খালি অ্যারে তৈরি করুন। এই অ্যারেটি उन সব টাস্ক ধারণ করবে जिन्हें টেবিল ভিউ এবং ডেটাবেসে যোগ করা দরকার।
এখন addTask() ফাংশনের ভিতরে Add অ্যাকশন ক্লোজারটি মডিফাই করুন যাতে এটি ইউজার ইনপুট পায় এবং সেই ইনপুটের জন্য একটি র্যান্ডম আইডি তৈরি করে। তারপর এটি আমাদের অ্যারেতে অ্যাপেন্ড করুন এবং ডেটাবেসে সংরক্ষণ করুন।
var tasks = [ToDoTask]()
if let text = ac.textFields?.first?.text {
// ডেটা মডেল অ্যারেতে ডেটা যোগ করুন
let t = ToDoTask()
t.taskid = UUID().uuidString
t.tasknote = text
self.tasks.append(t)
// ডেটাবেসে ডেটা যোগ করুন
try! self.realmDB.write {
self.realmDB.add(t)
}
// টেবিল ভিউ UI আপডেট করুন
self.tasktv.reloadData()
}
এখন অ্যাপটি রান করলে, ডেটা ডেটাবেসে সংরক্ষিত হবে। কিন্তু এটি টেবিল ভিউতে দেখাবে না কারণ আমরা ডেলিগেট মেথডগুলো ইমপ্লিমেন্ট করিনি।
ViewController ক্লাসকে UITableViewDelegate এবং UITableViewDataSource প্রোটোকল ইমপ্লিমেন্ট করিয়ে প্রোটোকল স্টাবগুলো যোগ করুন।
এখন numberOfRowsInSection মেথডের ভিতরে, আমাদের tasks অ্যারের কাউন্ট রিটার্ন করুন যা টেবিল ভিউতে যোগ করা সারির সংখ্যা নির্দেশ করে। এটি tasks অ্যারেতে উপস্থিত এলিমেন্টের সংখ্যার সমান।
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tasks.count
}
পরবর্তীতে আমাদের প্রতিটি সারির কন্টেন্ট নির্দিষ্ট করতে হবে। এটি আমরা cellForRowAt ডেলিগেট মেথড ব্যবহার করে করতে পারি। এখানে আমরা স্টোরiboard-এ উল্লেখ করা আইডেন্টিফায়ার ব্যবহার করে একটি সেল ডিকিউ করি এবং লেবেল টেক্সটকে tasks অ্যারে এলিমেন্টের tasknote প্রপার্টি হিসেবে নির্দিষ্ট করি।
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCell(withIdentifier: "cell") {
cell.textLabel?.text = tasks[indexPath.row].tasknote
return cell
}
return UITableViewCell()
}
ইউজারদের তাদের ইনপুট এডিট করার অনুমতি দেওয়া
এখন আমাদের ইউজারকে তাদের এন্ট্রি করা টাস্কগুলো এডিট করার অনুমতি দিতে হবে এবং পরিবর্তনগুলো ডেটাবেস এবং UI-তে আপডেট করতে হবে। আমরা ইউজার থেকে ইনপুট নেওয়ার অনুরূপ মেথড ব্যবহার করে এটি করতে পারি। didSelectRowAt ডেলিগেট মেথড ইমপ্লিমেন্ট করুন যা ইউজার টেবিল ভিউ সারি ট্যাপ করলে কল হবে।
নিচের কোডটি যোগ করুন যা একটি টেক্সট ভিউ সহ AlertViewController প্রদর্শন করে। তারপর সেলের কন্টেন্টটি এন্ট্রি করা টেক্সট দিয়ে আপডেট করুন, এবং একই সাথে ডেটাবেস কন্টেন্টও আপডেট করুন।
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let taskToModify = tasks[indexPath.row]
let ac = UIAlertController(title: "Update task", message: nil, preferredStyle: .alert)
ac.addTextField(configurationHandler: nil)
ac.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in
if let text = ac.textFields?.first?.text {
if !text.isEmpty {
try! self.realmDB.write {
taskToModify.tasknote = text
}
self.tasktv.reloadData()
}
}
}))
present(ac, animated: true, completion: nil)
}
সোয়াইপ টু ডিলিট: সারি মুছে ফেলা এবং টেবিল ভিউ ও ডেটাবেস উভয় থেকেই ডেটা সরানো
এখানে আমরা আমাদের টেবিল ভিউতে সোয়াইপ টু ডিলিট ফিচার ইমপ্লিমেন্ট করব যাতে ইউজাররা তাদের টাস্ক মুছে ফেলতে পারে। কিন্তু আন্ডার-দ-হুডে যখন ইউজার সোয়াইপ ডিলিট করে একটি টেবিল ভিউ সারি, তবে এটি ডেটাবেস থেকে, ডেটা মডেল অ্যারে থেকে ডেটা মুছে ফেলে এবং টেবিল ভিউর UI আপডেট করা উচিত।
এটি আমরা commit editingStyle ডেলিগেট মেথড ইমপ্লিমেন্ট করে এবং নিচের কোডটি যোগ করে করতে পারি:
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let taskToDelete = tasks[indexPath.row]
try! realmDB.write {
realmDB.delete(taskToDelete)
self.tasks.remove(at: indexPath.row)
self.tasktv.deleteRows(at: [indexPath], with: .fade)
}
}
}
ডেটাবেস থেকে সমস্ত ডেটা (যদি থাকে) ফেচ করে টেবিল ভিউতে প্রদর্শন করা
এখন আমরা আমাদের শেষ অপারেশন, Read ইমপ্লিমেন্ট করব। যখনই ইউজার অ্যাপটি লঞ্চ করবে, তখন এটি ডেটাবেস থেকে ডেটা (যদি ডেটা থাকে) ফেচ করবে এবং টেবিল ভিউতে প্রদর্শন করবে।
আমরা ভিউ কন্ট্রোলার সুইফ্ট ফাইলে getTodos নামে একটি ফাংশন তৈরি করে এবং তার ভিতরে নিচের কোডটি যোগ করে এটি করতে পারি:
func getTodos() {
// ডেটাবেস থেকে সমস্ত ডেটা পান
let notes = realmDB.objects(ToDoTask.self)
// ডুপ্লিকেট প্রতিরোধের জন্য মডেল ডেটা অ্যারে ক্লিয়ার করুন
self.tasks.removeAll()
/* যদি ফেচ করা ডেটা খালি না হয়, তবে এটি মডেল ডেটা অ্যারেতে যোগ করুন এবং UI আপডেট করুন */
if !notes.isEmpty {
for n in notes {
self.tasks.append(n)
}
self.tasktv.reloadData()
}
}
বোনাস টিপ: iOS সিমুলেটরে আপনার ডেটাবেস কন্টেন্ট কীভাবে দেখবেন
এখন যখন আপনি আপনার অ্যাপটি রান করবেন, আপনি দেখবেন এটি প্রত্যাশা অনুযায়ী কাজ করছে। কিন্তু আমরা কীভাবে চেক করব যে ডেটা রিয়েলি ডেটাবেসে সংরক্ষিত হয়েছে? আমরা MongoDB Realm Studio নামে একটি অ্যাপ ব্যবহার করতে পারি जिसके মাধ্যমে আমরা সিমুলেটরের রিয়েল্ম ডেটাবেসে সংরক্ষিত ডেটা দেখতে পারি।
নোট: এই মেথডটি শুধুমাত্র তখনই কাজ করে যখন আপনি iOS সিমুলেটর ব্যবহার করে অ্যাপটি টেস্ট করেন।
viewDidLoad() মেথডে, নিচের লাইনটি যোগ করুন যা আমাদের অ্যাপের রিয়েল ফাইল পাথ প্রিন্ট করবে:
print(realmDB.configuration.fileURL!)
এখন কনসোলে প্রিন্ট হওয়া ফাইল পাথটি কপি করুন, টার্মিনাল খুলুন, এবং নিচের কমান্ডটি রান করুন:
open REALM_FILE_PATH_HERE
উপরের কমান্ড রান করার আগে নিশ্চিত করুন যে আপনি ব্রাউজার থেকে MongoDB Realm Studio ডাউনলোড করে রেখেছেন।
এখন এটি MongoDB Realm Studio-তে অ্যাপের RealmFile খুলবে। এটি ডেটাবেসে সংরক্ষিত ডেটা টেবিল ফরম্যাটে প্রদর্শন করবে।
যদি আপনি টাস্ক এডিট বা ডিলিট করে আপনার ডেটা পরিবর্তন করেন, পরিবর্তনগুলো MongoDB Realm Studio অ্যাপে প্রতিফলিত হবে:
অভিনন্দন! আপনি একটি সিম্পল অ্যাপ তৈরি করেছেন যা iOS অ্যাপে CRUD অপারেশন ইমপ্লিমেন্ট করে।