Verileri yazma

Bu rehberde, Health Connect'te veri yazma veya güncelleme süreci ele alınmaktadır.

Veri yapısını ayarlama

Veri yazmadan önce kayıtları oluşturmamız gerekir. 50'den fazla veri türü için her birinin kendi yapısı vardır. Kullanılabilen veri türleri hakkında daha fazla ayrıntı için Jetpack referansına bakın.

Temel kayıtlar

Health Connect'teki Steps veri türü, bir kullanıcının okumalar arasında kaç adım gerçekleştirdiği bilgisini yakalar. Adım sayıları sağlık, fitness ve sağlıklı yaşam platformlarında yaygın olarak kullanılan bir ölçümü temsil eder.

Aşağıdaki örnekte adım sayısı verilerinin nasıl ayarlanacağı gösterilmektedir:

val stepsRecord = StepsRecord(
    count = 120,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET
)

Ölçü birimleriyle kayıt yapar

Health Connect, doğruluk sağlamak için değerleri ölçüm birimleriyle birlikte depolayabilir. Buna örnek olarak, çok büyük ve kapsamlı olan Nutrition veri türü verilebilir. Toplam karbonhidrattan vitaminlere kadar çok çeşitli, isteğe bağlı besin alanlarını içerir. Her veri noktası, bir yemek veya gıdanın parçası olarak potansiyel olarak tüketilen besinleri temsil eder.

Bu veri türünde, tüm besin maddeleri Mass, energy ise Energy birimi cinsinden temsil edilir.

Aşağıdaki örnekte, muz yiyen bir kullanıcı için beslenme verilerinin nasıl ayarlanacağı gösterilmektedir:

val banana = NutritionRecord(
    name = "banana",
    energy = 105.0.kilocalories,
    dietaryFiber = 3.1.grams,
    potassium = 0.422.grams,
    totalCarbohydrate = 27.0.grams,
    totalFat = 0.4.grams,
    saturatedFat = 0.1.grams,
    sodium = 0.001.grams,
    sugar = 14.0.grams,
    vitaminB6 = 0.0005.grams,
    vitaminC = 0.0103.grams,
    startTime = START_TIME,
    endTime = END_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endZoneOffset = END_ZONE_OFFSET
)

Seri verileriyle kayıtlar

Health Connect, seri verilerinin listesini saklayabilir. Bu türlerden biri, okumalar arasında algılanan bir dizi kalp atışı örneğini yakalayan Nabız veri türüdür.

Bu veri türünde samples parametresi, Nabız örnekleri listesiyle temsil edilir. Her örnek, bir beatsPerMinute değeri ve bir time değeri içerir.

Aşağıdaki örnekte, nabız serisi verilerinin nasıl ayarlanacağı gösterilmektedir:

val heartRateRecord = HeartRateRecord(
    startTime = START_TIME,
    startZoneOffset = START_ZONE_OFFSET,
    endTime = END_TIME,
    endZoneOffset = END_ZONE_OFFSET,
    // records 10 arbitrary data, to replace with actual data
    samples = List(10) { index ->
        HeartRateRecord.Sample(
            time = START_TIME + Duration.ofSeconds(index.toLong()),
            beatsPerMinute = 100 + index.toLong(),
        )
    }
)

Verileri yazma

Health Connect'teki yaygın iş akışlarından biri veri yazmadır. Kayıt eklemek için insertRecords kodunu kullanın.

Aşağıdaki örnekte, adım sayısı ekleyerek nasıl veri yazılacağı gösterilmektedir:

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = START_TIME,
            endTime = END_TIME,
            startZoneOffset = START_ZONE_OFFSET,
            endZoneOffset = END_ZONE_OFFSET
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

Verileri güncelle

Bir veya daha fazla kaydı değiştirmeniz gerekiyorsa, özellikle de uygulama veri deponuzu Health Connect'ten alınan verilerle senkronize etmeniz gerektiğinde verilerinizi güncelleyebilirsiniz. Mevcut verileri güncellemenin iki yolu vardır. Bu yöntem, kayıtları bulmak için kullanılan tanımlayıcıya bağlıdır.

Meta veri

Verileri güncellerken gerekli olduğu için önce Metadata sınıfını incelemek gerekir. Oluşturulduğunda Health Connect'teki her Record bir metadata alanı içerir. Aşağıdaki özellikler senkronizasyonla ilgilidir:

Kod Açıklama
id Health Connect'teki her Record benzersiz bir id değerine sahiptir.
Health Connect, yeni bir kayıt eklerken bunu otomatik olarak doldurur.
lastModifiedTime Her Record, kaydın en son değiştirildiği tarihi de izler.
Health Connect bu bilgiyi otomatik olarak doldurur.
clientRecordId Her Record, uygulama veri deponuzda referans olarak kullanılmak üzere kendisiyle ilişkilendirilmiş benzersiz bir kimliğe sahip olabilir.
Uygulamanız bu değeri sağlar.
clientRecordVersion Bir kaydın clientRecordId değeri olduğunda clientRecordVersion, verilerin uygulama veri deponuzdaki sürümle senkronize kalmasını sağlamak için kullanılabilir.
Uygulamanız bu değeri sağlar.

Kayıt kimliği üzerinden güncelleme

Verileri güncellemek için önce gerekli kayıtları hazırlayın. Gerekirse kayıtlarda değişiklik yapın. Ardından, değişiklikleri yapmak için updateRecords numaralı telefonu arayın.

Aşağıdaki örnekte verilerin nasıl güncelleneceği gösterilmektedir. Bu amaçla her kaydın alt bölge ofseti değerleri PST'ye ayarlanır.

suspend fun updateSteps(
    healthConnectClient: HealthConnectClient,
    prevRecordStartTime: Instant,
    prevRecordEndTime: Instant
) {
    try {
        val request = healthConnectClient.readRecords(
            ReadRecordsRequest(
                recordType = StepsRecord::class,
                timeRangeFilter = TimeRangeFilter.between(
                    prevRecordStartTime,
                    prevRecordEndTime
                )
            )
        )

        val newStepsRecords = arrayListOf<StepsRecord>()
        for (record in request.records) {
            // Adjusted both offset values to reflect changes
            val sr = StepsRecord(
                count = record.count,
                startTime = record.startTime,
                startZoneOffset = record.startTime.atZone(ZoneId.of("PST")).offset,
                endTime = record.endTime,
                endZoneOffset = record.endTime.atZone(ZoneId.of("PST")).offset,
                metadata = record.metadata
            )
            newStepsRecords.add(sr)
        }

        client.updateRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

İstemci Kayıt Kimliği aracılığıyla Upsert (İstemci Kaydı Kimliği) yükseltme

İsteğe bağlı İstemci Kaydı Kimliği ve İstemci Kaydı Sürümü değerlerini kullanıyorsanız updateRecords yerine insertRecords kullanmanızı öneririz.

insertRecords işlevi, verileri güncelleyebilir. Veriler Health Connect'te belirtilen İstemci Kayıt Kimliği grubuna göre mevcutsa verilerin üzerine yazılır. Aksi takdirde, yeni veriler olarak yazılır. Bu senaryo, uygulama veri deponuzdaki verileri Health Connect ile senkronize etmeniz gerektiğinde kullanmak için uygundur.

Aşağıdaki örnekte, uygulama veri deposundan çekilen veriler üzerinde nasıl üst işlem gerçekleştirileceği gösterilmektedir:

suspend fun pullStepsFromDatastore() : ArrayList<StepsRecord> {
    val appStepsRecords = arrayListOf<StepsRecord>()
    // Pull data from app datastore
    // ...
    // Make changes to data if necessary
    // ...
    // Store data in appStepsRecords
    // ...
    var sr = StepsRecord(
        // Assign parameters for this record
        metadata = Metadata(
            clientRecordId = cid
        )
    )
    appStepsRecords.add(sr)
    // ...
    return appStepsRecords
}

suspend fun upsertSteps(
    healthConnectClient: HealthConnectClient,
    newStepsRecords: ArrayList<StepsRecord>
) {
    try {
        healthConnectClient.insertRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

Bundan sonra, bu işlevleri ana iş parçacığınızda çağırabilirsiniz.

upsertSteps(healthConnectClient, pullStepsFromDatastore())

İstemci Kaydı Sürümünde değer kontrolü

Verileri yükseltme işleminiz İstemci Kaydı Sürümü'nü içeriyorsa Health Connect, clientRecordVersion değerlerinde karşılaştırma kontrolleri gerçekleştirir. Eklenen verilerdeki sürüm, mevcut verilerdeki sürümden yüksekse yukarı işlem gerçekleşir. Aksi takdirde işlem, değişikliği yok sayar ve değer aynı kalır.

Verilerinize sürüm oluşturmayı dahil etmek için Metadata.clientRecordVersion sürümüne, sürüm oluşturma mantığınıza göre bir Long değeri sağlamanız gerekir.

val sr = StepsRecord(
    count = count,
    startTime = startTime,
    startZoneOffset = startZoneOffset,
    endTime = endTime,
    endZoneOffset = endZoneOffset,
    metadata = Metadata(
        clientRecordId = cid,
        clientRecordVersion = version
    )
)

Upser'lar değişiklik olduğunda version değerini otomatik olarak artırmaz ve bu sayede verilerin üzerine yazılması gibi beklenmedik durumlar önlenir. Bununla birlikte, ona manuel olarak daha yüksek bir değer sağlamanız gerekir.

En iyi uygulamalar

Mantığı oluşturduktan sonra, veri yazarken veya güncellerken en iyi uygulamaları takip edebilirsiniz.