Swift'te Realm ile CRUD İşlemleri



Herkese merhabalar. Ben Yuşa, WeWALK'ta iOS Developer olarak çalışıyorum. Önceki yazılarımın aksine, bundan sonraki yazılarımda iOS ve Swift üzerine yazılar paylaşacağım. Bu, iOS ile ilgili ilk makalem, bu yüzden sizlerle paylaşmaktan büyük heyecan duyuyorum.


Bu yazıda "Realm, Swift'te nasıl kullanılır?" sorusuna bir cevap bulmaya çalışacağız. Beni GitHub'da takip ediyorsanız, kesinlikle açık kaynak kodu ne kadar sevdiğimi biliyorsunuzdur. Açık kaynaklı iOS projelerimden birinde CoreData yerine Realm kullanmaya başladım ve çok beğendim! Realm'i kullandığım projeden bazı kod parçalarını göstereceğim ve böylece onu mevcut bir projeye nasıl uygulayacağımızı anlayacağız. Ek olarak, hikayenin sonunda Realm'i kullandığım açık kaynaklı projeme de ulaşabilirsiniz! Harika, değil mi? O halde, hemen işe koyulalım!



Realm


İlk olarak, Realm'i ve bağlamını anlayalım. Özetle Realm, doğrudan telefonların, tabletlerin veya giyilebilir cihazların içinde çalışan bir mobil veritabanıdır ve son derece zengin bir özellik setini korurken, genel işlemlerde SQLite'den bile daha hızlıdır.


Realm'i CRUD işlemleri için kullanacağız. Sırasıyla Create, Read, Update ve Delete. Mevcut veya yeni oluşturacağınız bir projeye, yazıdaki tüm kod satırlarını uygulayabilirsiniz. Seçim sizin!



Cocoapods ve Podfile


Artık programlamaya girelim! Yapacağımız ilk iş, Podfile oluşturmak olacak. Podfile, kullanmak istediğimiz kütüphaneleri kurduğumuz yerdir. Podfile oluşturmak için makinenizce CocoaPods kurulu olmalıdır. CocoaPods, Xcode projeleriniz için kütüphane bağımlılıklarını yönetir. Binlerce üçüncü taraf kitaplığı içerir. Makinenizde CocoaPods yoksa, lütfen terminalinizde aşağıdaki satırı çalıştırın:

sudo gem install cocoapods

CocoaPods'u kurduktan sonra artık projeye geçebiliriz. Projeyi terminalde açalım ve Podfile'ımızı oluşturmak için aşağıdaki satırı yazalım:

pod init

Yukarıdaki satır, Podfile'ı oluşturacaktır, Podfile'ı, terminalden aşağıdaki satırı yazarak açalım:

open Podfile -a Xcode

Yorum satırı olarak duruyorsa aşağıdaki satırı yorum satırı olmaktan çıkarmamız gerek:

use_frameworks!

Ve Realm'i projeye kurmak için aşağıdaki satırı ekleyelim:

pod 'RealmSwift'

Realm'i kurmak için aşağıdaki satırı kullanacağız:

pod install

Kurulum tamamlandığında, projenizde Realm'i göreceksiniz. Ayrıca, yukarıdaki satır, .xcworkspace uzantılı bir dosya oluşturacaktır. Proje üzerinde çalışmaya .xcworkspace uzantılı dosyayı kullanarak devam edeceğiz.



Realm'i Import Etmek


Geliştirdiğim proje, bir yapılacaklar listesi (to-do list) uygulaması. Category(Kategori) ve Item(Öğe) olarak iki farklı model sınıfım var. Her öğenin yalnızca bir kategorisi olmalı, her kategorinin ise birden fazla öğesi olabilir. Aralarında one-to-many ilişkisi olacak şekilde tasarlandı. Bu ufak bilgilerden sonra bu model sınıflarını oluşturalım.


Realm'i Swift'de aşağıdaki satırı kullanarak bir sınıfa import ediyoruz:

import RealmSwift

Ayrıca Swift'de aşağıdaki satırı kullanarak Realm'de bir nesne öğesi oluşturuyoruz:

@objc dynamic var name: String = “”

dynamic anahtar kelimesi, ilk bakışta tanıdık gelmeyebilir, çünkü sık kullanılan bir keyword değil. Ama merak etmeyin, neden kullandığımızı açıklayacağım. dynamic'i kullandığımızda, derleyiciye o üyeye erişmek için dinamik gönderimin kullanılması gerektiğini söylersiniz. Realm'in de olayı budur: hızlı ve dinamik tepki.




Minik bir örnekten sonra, Category(Kategori) model sınıfımızı oluşturalım:


import RealmSwift

class Category: Object {
    @objc dynamic var name: String = “”
    let items = List<Item>()
}

Burada, List adında bir jenerik tip var ve bu, Realm'e özgü bir tip. Swift'teki Array gibi, List de depoladığı türe göre parametreleştirilen genel bir türdür. Bu yüzden, Item(Öğe) verilerini Category(Kategori)'ye kaydediyorum. Bundan sonra, diğer sınıfı, yani Item(Öğe) sınıfını oluşturacağım.


import RealmSwift

class Item: Object {
    @objc dynamic var title: String = “”
    @objc dynamic var done: Bool = false
    var parentCategory = LinkingObjects(fromType: Category.self, property: “items”)
}

Ve Realm'e ait olan bir başka bileşen, LinkingObjects. LinkingObjects, otomatik güncellenen bir kapsayıcı(container) türüdür. Bir özellik ilişkisi aracılığıyla sahip olduğu model nesnesine bağlı sıfır veya daha fazla nesneyi temsil eder. LinkingObjects ile Category(Kategori) ve Item(Öğe) arasında bir ilişki oluşturabiliriz.



Realm ile Create İşlemi


Realm kullanarak bir kategori oluşturmak için, öncelikle, Create işlemini yapacağımız Realm'i import edeceğiz. Kendi adıma, bu işlemi CategoryViewController'da uygulayacağım.

import RealmSwift

Ve sonra, Realm'i default olarak alacağız.

import RealmSwift
class CategoryViewController: UITableViewController {
    // Get the default Realm.
    let realm = try! Realm()
   
    ...
    
}

Şimdi, Realm'i Create işlemi için kullanabiliriz. save adında bir fonksiyonum var ve bir parametresi var: save(category: Category). Bu fonksiyon, bir kategori oluşturmamızı sağlıyor. Do-catch bloğunda, Create işlemimizi yapacağız.


func save(category: Category) {
    do {
        try realm.write {
            realm.add(category)
        }
    } catch {
        print("An error occurred while saving the category: \(error)")
    }
    
    tableView.reloadData()
}


Realm ile Read İşlemi


Realm ile objects fonksiyonunu kullanmak, tek bir kod satırı yazarak oluşturduğumuz kategorileri okumak için yeterli olacaktır. Bölgede depolanan belirli türdeki tüm nesneleri döndürür.

class CategoryViewController: UITableViewController {
    var categories: Results<Category>!

    ...
   
    func loadCategories() {
        // Read the categories.
        categories = realm.objects(Category.self)

        tableView.reloadData()
    }
}


Realm ile Update İşlemi


Pekala, şimdi de öğeleri güncelleme hakkında konuşalım. Ama nasıl? Projede, her öğenin hem adı hem de durumu vardır. Bu durum, o öğenin yapılıp yapılmadığı ile ilgilidir. Bunu kontrol etmek için tik simgesini kullanıyoruz. UITableView'da öğenin durumunu güncelleyeceğiz. Burada, ToDoListViewController'ı kullanacağım.


class ToDoListViewController: UITableViewController {
    var todoItems: Results<Item>?

    ...
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let item = todoItems?[indexPath.row] {
            do {
                try realm.write {
                    // Update the item's status.
                    item.done = !item.done
                }
            } catch {
                print("An error occurred while saving the status: \(error)")
            }
        }
        
         // Reload the table view after the check action.
         tableView.reloadData()

         // Deselect the selected row of the table view.
         tableView.deselectRow(at: indexPath, animated: true)
    }
    
    ... 
}


Realm'de Delete İşlemi


Delete işlemi, Update işlemiyle hemen hemen aynıdır. Tek fark, var olan durumu kontrol etmek yerine delete() fonksiyonunu kullanmak olacak.

class ToDoListViewController: UITableViewController {
    var todoItems: Results<Item>?
    
    ...
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // Update the item's status.
        if let item = todoItems?[indexPath.row] {
            do {
                try realm.write {
                    try realm.write {
                        // Delete an item.
                        realm.delete(item)
                    }
                }
            } catch {
                print("An error occurred while deleting the item: \(error)")
            }
        }

        // Reload the table view after the check action.
        tableView.reloadData()

        // Deselect the selected row of the table view.
        tableView.deselectRow(at: indexPath, animated: true)
    }

    ...
}


Sonuç


Sonuç olarak "Realm nedir ve CRUD işlemlerinde nasıl kullanılır?" ve "Cocoapods nedir, makineye nasıl kurulur ve projede nasıl kullanılır?" gibi sorulara yanıt bulduk. Yazının başında da söylediğim gibi Realm'i kullandığım projeyi paylaşıyorum. Cümlenin sonundaki linke tıklayarak ulaşabilirsiniz: Listinn


Hepinize, sağlıklı bir gün geçirmenizi diliyorum!


#ios #realm #crud

0 yorum

Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2020 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın