Core Data — konsep kunci, NSManagedObject dan arsitektur

Penulis: IT Sectr Diterbitkan: 2026-03-11 Waktu membaca: 11 mnt

Core Data — framework Apple untuk mengelola graf objek dalam aplikasi iOS dan macOS. Framework ini menyediakan persistensi data, pelacakan perubahan, pembatalan operasi, dan integrasi dengan UI melalui NSFetchedResultsController. Menurut dokumentasi Apple Developer (2025), Core Data bukanlah basis data — ini adalah lapisan pemodelan objek yang secara default menggunakan SQLite sebagai penyimpanan permanen untuk memuat dan menyimpan objek.

Poin Utama

  • Core Data — framework ORM untuk iOS/macOS yang mengelola graf objek dan penyimpanannya di penyimpanan permanen.
  • NSManagedObjectModel — skema data yang mendeskripsikan entitas, atribut, dan relasi antar objek dalam model Core Data.
  • NSManagedObjectContext — area kerja untuk membuat, membaca, memperbarui, dan menghapus objek dengan pelacakan perubahan.
  • NSPersistentContainer — titik masuk tunggal yang mengenkapsulasi model, konteks, dan penyimpanan Core Data di iOS 10+.
  • NSFetchedResultsController — kelas untuk integrasi Core Data dengan UITableView/UICollectionView dengan pembaruan otomatis saat perubahan.

Apa itu Core Data?

Core Data — adalah framework manajemen graf objek dan persistensi, bagian dari Cocoa Touch SDK dari Apple. Framework ini menyediakan antarmuka berorientasi objek untuk bekerja dengan data: pengembang beroperasi dengan entitas (Entity), atribut, dan relasi (Relationship), dan Core Data mengubah objek-objek ini menjadi catatan basis data relasional di balik layar.

Core Data diperkenalkan di Mac OS X 10.4 Tiger (2005) untuk macOS dan diporting ke iOS 3.0 (2009). Selama lebih dari 20 tahun, framework ini telah berevolusi dari lapisan abstraksi sederhana di atas SQLite menjadi tumpukan lengkap dengan dukungan sinkronisasi cloud melalui NSPersistentCloudKitContainer, multithreading melalui manajemen konteks otomatis, dan pemuatan asinkron melalui Swift Concurrency.

Menurut survei pengembang iOS dari Slack Community (2025), Core Data digunakan di 68% aplikasi iOS komersial untuk penyimpanan data lokal. Meskipun dikritik karena kompleksitas dan multilapis, framework ini tetap menjadi standar untuk aplikasi Apple berkat integrasi yang erat dengan sistem, biaya nol (tertanam di SDK), dan dukungan sinkronisasi iCloud.

Core Data bukan basis data

Kesalahpahaman umum — menganggap Core Data sebagai basis data. Framework ini tidak menjalankan kueri SQL secara langsung dan bukan DBMS. Core Data adalah lapisan manajemen objek (object graph management) yang dapat menggunakan SQLite, Binary, atau In-Memory untuk persistensi. Analogi: Core Data seperti ORM seperti Hibernate atau Entity Framework, tetapi untuk ekosistem Apple, dan SQLite di bawahnya — seperti MySQL di bawah Hibernate.

Arsitektur Core Data: tumpukan dan komponen

Tumpukan Core Data terdiri dari empat komponen yang saling terhubung: NSManagedObjectModel (skema data), NSPersistentStoreCoordinator (koordinator penyimpanan), NSManagedObjectContext (konteks kerja), dan NSPersistentContainer (wadah terpadu yang menggabungkan ketiganya sejak iOS 10). NSPersistentContainer mengotomatiskan pembuatan dan konfigurasi tumpukan.

Setiap komponen menjalankan fungsi yang ditentukan secara ketat. NSManagedObjectModel memuat file .xcdatamodeld dengan deskripsi entitas. NSPersistentStoreCoordinator menghubungkan model dengan file penyimpanan fisik (SQLite). NSManagedObjectContext menyediakan area sementara untuk bekerja dengan objek. Container menggabungkan semuanya dalam satu panggilan inisialisasi.

Jenis penyimpanan Core Data

SQLite (NSSQLiteStoreType) — penyimpanan standar yang digunakan di sebagian besar aplikasi. Data disimpan dalam satu file .sqlite dengan dukungan transaksi ACID. Binary (NSBinaryStoreType) — penyimpanan dalam format biner untuk kumpulan data kecil (hingga beberapa ratus objek). In-Memory (NSInMemoryStoreType) — penyimpanan sementara di RAM tanpa penyimpanan ke disk, digunakan untuk pengujian dan cache.

Jenis penyimpananFormatPerformaKapan digunakan
SQLite.sqliteTinggiPilihan standar untuk production
Binary.binarySedangKumpulan data kecil
In-MemoryRAMMaksimalPengujian, cache, data sementara
CloudKitiCloudTergantung jaringanSinkronisasi antar perangkat

Pemilihan penyimpanan diatur dengan satu baris saat inisialisasi NSPersistentStoreDescription. Pengembang dapat mengganti penyimpanan dari SQLite ke In-Memory untuk pengujian unit atau ke CloudKit untuk sinkronisasi iCloud tanpa mengubah kode kerja dengan objek — Core Data mengabstraksi perbedaan antara jenis penyimpanan dengan API konteks yang seragam.

NSManagedObject dan NSManagedObjectContext

NSManagedObject — kelas dasar untuk semua objek Core Data yang mewakili satu catatan entitas. Setiap managed object memiliki NSManagedObjectID unik (pengenal permanen), terikat pada konteks, dan melacak perubahannya melalui KVO (Key-Value Observing). Pengembang membuat subkelas NSManagedObject untuk menentukan properti yang diketik dari entitas.

NSManagedObjectContext — komponen pusat Core Data yang menyediakan area kerja untuk semua operasi dengan objek. Konteks melacak penambahan, penghapusan, dan perubahan objek (change tracking), mendukung pembatalan operasi melalui undoManager, dan secara otomatis menggabungkan perubahan dari konteks lain saat menerima pemberitahuan penyimpanan.

Keamanan thread konteks

Aturan antrean pribadi: NSManagedObjectContext dibuat dengan tipe .privateQueueConcurrencyType atau .mainQueueConcurrencyType. Konteks utama terikat pada thread UI utama, konteks pribadi dijalankan pada antrean latar belakang. Setiap konteks hanya boleh digunakan pada antreannya sendiri — akses ke managed object dari thread lain menyebabkan crash. parentContext memungkinkan pengorganisasian hierarki konteks untuk penulisan asinkron.

swift
struct CoreDataStack {
    let container: NSPersistentContainer

    init(name: String) {
        container = NSPersistentContainer(name: name)
        container.loadPersistentStores { _, error in
            if let error = error {
                fatalError("Failed to load store: \(error)")
            }
        }
        container.viewContext.automaticallyMergesChangesFromParent = true
    }

    func backgroundContext() -> NSManagedObjectContext {
        let context = container.newBackgroundContext()
        context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        return context
    }
}

NSPersistentContainer secara otomatis membuat viewContext (main queue) dan menyediakan newBackgroundContext() untuk operasi latar belakang. Properti automaticallyMergesChangesFromParent = true menyebabkan viewContext secara otomatis mengambil perubahan dari konteks latar belakang saat disimpan, memperbarui UI tanpa pengambilan ulang data secara manual.

Persistent Store dan hubungan dengan SQLite

NSPersistentStoreCoordinator mengelola penyimpanan data fisik: membuka file, membuat tabel SQLite berdasarkan model, menjalankan migrasi saat perubahan skema. Saat inisialisasi NSPersistentStoreDescription dengan tipe NSSQLiteStoreType, Core Data membuat file SQLite dengan skema yang sesuai dengan model .xcdatamodeld.

Core Data tidak menggunakan kueri SQL standar melalui SELECT/INSERT/UPDATE. Sebagai gantinya, ia menghasilkan perintah SQL internal berdasarkan model dan kueri melalui NSFetchRequest. Pengembang dapat mengaktifkan pencatatan SQL melalui argumen peluncuran -com.apple.CoreData.SQLDebug 1 untuk men-debug performa kueri.

Migrasi Core Data

Migrasi ringan (Lightweight Migration) — proses otomatis pembaruan skema SQLite saat menambahkan atribut baru, mengubah optional/required, atau mengganti nama dengan renamingID. Migrasi berat diperlukan untuk perubahan skema yang radikal seperti penggabungan atau pemisahan entitas, dan dilakukan melalui NSMigrationManager kustom.

swift
let description = NSPersistentStoreDescription()
description.url = FileManager.default
    .urls(for: .documentDirectory, in: .userDomainMask)
    .first?
    .appendingPathComponent("Model.sqlite")
description.setOption(true as NSNumber,
    forKey: NSMigratePersistentStoresAutomaticallyOption)
description.setOption(true as NSNumber,
    forKey: NSInferMappingModelAutomaticallyOption)

let container = NSPersistentContainer(name: "AppModel")
container.persistentStoreDescriptions = [description]
container.loadPersistentStores { _, error in
    if let error = error { print("Migration error: \(error)") }
}

Konfigurasi migrasi otomatis melalui NSMigratePersistentStoresAutomaticallyOption dan NSInferMappingModelAutomaticallyOption memungkinkan Core Data memperbarui file SQLite secara mandiri saat menambahkan atribut atau entitas dalam versi model baru. Jika migrasi tidak memungkinkan, store coordinator melempar kesalahan dengan deskripsi penyebab — pengembang harus mengimplementasikan migrasi kustom melalui NSMigrationManager.

Core Data dalam praktik: kode dan contoh

NSFetchRequest — alat utama untuk mengambil objek dari Core Data. Kueri berisi nama entitas, predikat (filter), pengurutan, batas, dan offset. Hasil dikembalikan sebagai array NSManagedObject atau subkelas yang diketik. NSPredicate mendukung kondisi kompleks dengan AND, OR, IN, LIKE, dan subkueri.

NSBatchDeleteRequest — cara efisien untuk menghapus massal objek tanpa memuat masing-masing ke memori. Kueri dijalankan pada level SQLite, melewati managed object context, dan hanya memperbarui konteks setelah selesai. Kueri batch serupa ada untuk pembaruan (NSBatchUpdateRequest) dan penyisipan (NSBatchInsertRequest).

Contoh operasi CRUD

CRUD (Create, Read, Update, Delete) di Core Data dijalankan melalui metode konteks: insert, fetch, save, dan delete. Semua perubahan bersifat sementara sampai pemanggilan context.save() — metode ini menyimpan perubahan di penyimpanan permanen SQLite. Pada kesalahan penyimpanan, konteks tetap dalam keadaan berubah untuk percobaan ulang.

swift
let context = container.viewContext

// Buat
let user = User(context: context)
user.id = 42
user.name = "Alice"

// Baca
let request = User.fetchRequest()
request.predicate = NSPredicate(format: "name CONTAINS %@", "Ali")
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let results = try context.fetch(request)

// Perbarui
results.first?.name = "Alice Updated"

// Hapus
if let first = results.first { context.delete(first) }

// Simpan
try context.save()

Penyimpanan konteks (context.save()) — operasi kritis. Jika penyimpanan tidak dipanggil, semua perubahan hanya tetap di memori. Konteks melacak status hasChanges, yang dapat diperiksa sebelum penyimpanan. Untuk operasi latar belakang, gunakan newBackgroundContext dengan penyimpanan sendiri, dan untuk UI — viewContext dengan penyimpanan otomatis berdasarkan timer atau saat aplikasi masuk ke latar belakang.

Praktik terbaik Core Data

Praktik pertama — gunakan NSPersistentCloudKitContainer untuk sinkronisasi data antar perangkat pengguna melalui iCloud. Sinkronisasi cloud diaktifkan dengan menambahkan opsi CloudKit ke deskripsi penyimpanan. Core Data secara otomatis mengelola konflik selama sinkronisasi dan menggabungkan perubahan dari perangkat lain.

Praktik kedua — hindari fetchRequest tanpa predikat pada tabel besar. Setiap pengambilan tanpa syarat memuat semua objek entitas ke memori, yang menyebabkan konsumsi RAM tinggi dan perlambatan UI. Selalu gunakan predikat dan batas. Untuk paginasi, gunakan fetchLimit dan fetchOffset di NSFetchRequest.

Praktik ketiga — konfigurasikan mergePolicy untuk menyelesaikan konflik pada akses multi-thread. NSMergeByPropertyObjectTrumpMergePolicy memperbarui properti yang bertikai dari konteks yang terakhir disimpan. NSRollbackMergePolicy membatalkan perubahan konteks saat ini saat terjadi konflik. Pemilihan kebijakan tergantung pada logika bisnis aplikasi.

Praktik keempat — gunakan NSFetchedResultsController untuk integrasi dengan tabel dan koleksi. Ia secara otomatis berlangganan pemberitahuan NSManagedObjectContextDidSave, hanya memuat objek yang diperlukan (faulting), dan memberi tahu delegasi tentang penyisipan, penghapusan, dan pemindahan dengan jalur indeks yang sesuai untuk animasi UITableView.

Performa: prefetching dan faulting

Faulting — mekanisme pemuatan malas objek Core Data. Managed object yang dikembalikan oleh kueri fetch berada dalam status fault — atributnya tidak dimuat sepenuhnya, hanya pengenalnya. Pemuatan penuh (fire fault) terjadi saat akses pertama ke atribut mana pun. Relationship prefetching (setRelationshipKeyPathsForPrefetching) memuat objek terkait terlebih dahulu, menghindari kueri N+1.

swift
extension UserRepository {
    func fetchUsersWithPosts() throws -> [User] {
        let request = User.fetchRequest()
        request.predicate = NSPredicate(format: "isActive == YES")
        request.relationshipKeyPathsForPrefetching = ["posts"]
        request.returnsObjectsAsFaults = false
        request.fetchBatchSize = 20

        let context = container.viewContext
        return try context.fetch(request)
    }
}

fetchBatchSize = 20 memaksa Core Data untuk memuat data dalam potongan 20 objek (untuk ditampilkan di layar), tanpa memuat seluruh tabel sekaligus. Bendera returnsObjectsAsFaults = false menjamin bahwa atribut semua pengguna dimuat segera, yang berguna untuk tampilan langsung. Prefetching relasi "posts" menghindari kueri terpisah untuk setiap pengguna saat mengakses posting.

Pertanyaan yang Sering Diajukan

Apakah Core Data adalah basis data?

Tidak, Core Data adalah framework manajemen graf objek. Ia menyediakan API untuk bekerja dengan objek, melacak perubahan, dan menyimpannya. Basis data di bawah Core Data (secara default SQLite) tidak boleh disamakan dengan framework itu sendiri. Core Data adalah ORM, bukan DBMS.

Bisakah Core Data digunakan tanpa SQLite?

Ya, Core Data mendukung tiga jenis penyimpanan: SQLite, Binary, dan In-Memory. Pemilihan penyimpanan diatur melalui NSPersistentStoreDescription. Penyimpanan In-Memory tidak menyimpan data ke disk dan cocok untuk pengujian unit. Penyimpanan Binary adalah format usang untuk kumpulan objek yang ringkas.

Bagaimana cara memigrasi Core Data ke versi model baru?

Untuk migrasi ringan, aktifkan NSMigratePersistentStoresAutomaticallyOption dan NSInferMappingModelAutomaticallyOption. Untuk perubahan kompleks, buat Mapping Model (.xcmappingmodel) melalui Xcode. Penyimpanan CloudKit (NSPersistentCloudKitContainer) mendukung migrasi secara otomatis saat sinkronisasi skema dengan server iCloud.

Apa perbedaan Core Data dengan SwiftData?

SwiftData — adalah framework Apple baru (iOS 17+), dibangun di atas Core Data menggunakan Swift Macros dan Swift Concurrency. SwiftData lebih sederhana dalam sintaks: entitas dideskripsikan dengan makro @Model, konteks — dengan @Environment(\.modelContext). Di balik layar, SwiftData menggunakan tumpukan Core Data dan SQLite yang sama.

Bagaimana cara men-debug kueri Core Data yang lambat?

Aktifkan argumen peluncuran -com.apple.CoreData.SQLDebug 1 — Core Data akan menampilkan semua kueri SQL dan durasinya di konsol Xcode. Untuk pembuatan profil, gunakan Instruments dengan template Core Data, yang menunjukkan jumlah kueri fault, pemuatan objek, dan waktu penyimpanan konteks.

Ringkasan

  • Core Data — framework manajemen graf objek dan persistensi data untuk iOS dan macOS, menggunakan SQLite sebagai penyimpanan standar.
  • Tumpukan Core Data mencakup NSManagedObjectModel, NSPersistentStoreCoordinator, NSManagedObjectContext, dan NSPersistentContainer untuk konfigurasi terpadu.
  • NSManagedObjectContext — area kerja dengan pelacakan perubahan, dukungan pembatalan, dan penggabungan otomatis dari konteks latar belakang.
  • NSFetchRequest dengan NSPredicate dan prefetching — alat pengambilan utama dengan optimasi melalui batch size dan faulting.
  • Lightweight Migration secara otomatis memperbarui skema SQLite saat menambahkan atribut dan entitas Core Data dalam versi model baru.
  • NSPersistentCloudKitContainer menambahkan sinkronisasi iCloud antar perangkat pengguna dengan resolusi konflik otomatis.
  • Rekomendasi — gunakan Core Data untuk aplikasi iOS dengan model objek hierarkis, dan untuk penyimpanan lokal sederhana, pertimbangkan GRDB atau SwiftData.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga