SwiftData propertiesToFetch question

I have a simple model

@Model
final class Movie: Identifiable {
    #Index\<Movie\>(\[.name\])

    var id = UUID()
    var name: String
    var genre: String?

    init(name: String, genre: String?) {
        self.name = name
        self.genre = genre
    }
}

I turned on SQL debugging by including '-com.apple.CoreData.SQLDebug 3' argument on launch.

When I fetch the data using the following code, it selects 3 records initially, but then also selects each record individually even though I am not referencing any other attributes.

var fetchDescriptor = FetchDescriptor\<Movie\>()
fetchDescriptor.propertiesToFetch = \[.id, .name\]
fetchDescriptor.fetchLimit = 3

do {
   print("SELECT START")
   movies = try modelContext.fetch(fetchDescriptor)
   print("SELECT END")
} catch {
    print("Failed to load Movie model.")
}

I see it selecting the 3 rows initially, but then it selects each one separately. Why would it do this on the initial fetch? I was hoping to select the data that I want to display and let the system select the entire record only when I access a variable that I did not initially fetch.

CoreData: annotation: fetch using NSSQLiteStatement <0x600002158af0> on entity 'Movie' with sql text 'SELECT 1, t0.Z_PK, t0.ZID, t0.ZNAME FROM ZMOVIE t0  LIMIT 3' returned 3 rows with values: (
    "<NSManagedObject: 0x600002158d70> (entity: Movie; id: 0xa583c7ed484691c1 <x-coredata://71E60F4C-1A40-4DB7-8CD1-CD76B4C11949/Movie/p1>; data: <fault>)",
    "<NSManagedObject: 0x600002158d20> (entity: Movie; id: 0xa583c7ed482691c1 <x-coredata://71E60F4C-1A40-4DB7-8CD1-CD76B4C11949/Movie/p2>; data: <fault>)",
    "<NSManagedObject: 0x600002158f00> (entity: Movie; id: 0xa583c7ed480691c1 <x-coredata://71E60F4C-1A40-4DB7-8CD1-CD76B4C11949/Movie/p3>; data: <fault>)"
)
CoreData: annotation: fetch using NSSQLiteStatement <0x600002154d70> on entity 'Movie' with sql text 'SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZGENRE, t0.ZID, t0.ZNAME FROM ZMOVIE t0 WHERE  t0.Z_PK = ? ' returned 1 rows
CoreData: annotation:  with values: (
    "<NSSQLRow: 0x600000c89500>{Movie 1-1-1 genre=\"Horror\" id=4C5CB4EB-95D7-4DC8-B839-D4F2D2E96ED0 name=\"A000036\" and to-manys=0x0}"
)

This all happens between the SELECT START and SELECT END print statements. Why is it fulfilling the faults immediately?

Batch Size:

Setting a fetch batch size might help. Core Data will pull in batches of objects at a time and release the oldest batch when more than a certain number of batches are around.

fetchDescriptor.fetchLimit = 3
fetchDescriptor.fetchBatchSize = 1 // Or a small number

propertiesToFetch is not supported as of today. If you don't mind, please file a feedback report and share your report ID here for folks to track.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

SwiftData propertiesToFetch question
 
 
Q