ซิงค์ข้อมูล

แอปส่วนใหญ่ที่ผสานรวมกับ Health Connect มีพื้นที่เก็บข้อมูลของตนเองซึ่งใช้เป็นแหล่งข้อมูล Health Connect มีวิธีต่างๆ ในการซิงค์แอปของคุณ

ตรวจสอบว่าแอปของคุณมีลักษณะดังนี้

  • ส่งข้อมูลใหม่หรือข้อมูลที่มีการอัปเดตจากที่เก็บข้อมูลของแอปไปยัง Health Connect
  • ดึงข้อมูลการเปลี่ยนแปลงจาก Health Connect ซึ่งจะแสดงในที่เก็บข้อมูลของแอป
  • ลบข้อมูลออกจาก Health Connect เมื่อมีการลบข้อมูลในดาต้าสตอเรจของแอป

ในแต่ละกรณี โปรดตรวจสอบว่ากระบวนการซิงค์ทำให้ทั้ง Health Connect และที่เก็บข้อมูลของแอปสอดคล้องกัน

ส่งข้อมูลไปยัง Health Connect

ส่วนแรกของกระบวนการซิงค์คือการป้อนข้อมูลจากดาต้าสตอเรจของแอปไปยังดาต้าสตอเรจของ Health Connect

เตรียมข้อมูล

โดยปกติแล้ว ระเบียนในที่เก็บข้อมูลของแอปจะมีรายละเอียดต่อไปนี้

  • คีย์ที่ไม่ซ้ำกัน เช่น UUID
  • เวอร์ชันหรือการประทับเวลา

ออกแบบที่เก็บข้อมูลของแอปเพื่อติดตามข้อมูลที่ส่งไปยัง Health Connect แล้ว โดยทําตามตรรกะต่อไปนี้

  • ระบุรายการการเปลี่ยนแปลงและโทเค็นที่ใช้เรียกข้อมูลระเบียนที่มีการอัปเดตนับตั้งแต่มีการออกโทเค็นครั้งล่าสุด
  • ติดตามเวลาที่แก้ไขข้อมูลส่งออกครั้งล่าสุด

ขั้นตอนเหล่านี้มีความสำคัญเพื่อให้แน่ใจว่ามีการส่งเฉพาะข้อมูลใหม่หรือข้อมูลที่มีการอัปเดตไปยัง Health Connect

เขียนข้อมูลลงใน Health Connect

หากต้องการส่งข้อมูลไปยัง Health Connect ให้ทำตามขั้นตอนต่อไปนี้

  1. รับรายการรายการใหม่หรือที่อัปเดตจากที่เก็บข้อมูลของแอป
  2. สําหรับแต่ละรายการ ให้สร้างออบเจ็กต์ Record ที่เหมาะกับประเภทข้อมูลนั้น เช่น สร้างออบเจ็กต์ WeightRecord สำหรับข้อมูลที่เกี่ยวข้องกับน้ำหนัก
  3. ระบุออบเจ็กต์ Metadata ที่มี Record แต่ละรายการโดยใช้คีย์ที่ไม่ซ้ำกันและรายละเอียดเวอร์ชันจากที่เก็บข้อมูลของแอป หากข้อมูลไม่มีเวอร์ชัน คุณสามารถใช้ค่า Long ของการประทับเวลาปัจจุบันแทนได้

    val record = WeightRecord(
        metadata = Metadata(
            clientRecordId = "<Your record's Client ID>",
            clientRecordVersion = <Your record's version>
        ),
        weight = weight,
        time = time,
        zoneOffset = zoneOffset
    )
    
  4. อัปเดตข้อมูลไปยัง Health Connect โดยใช้ insertRecords การอัปโหลดข้อมูลหมายความว่าระบบจะเขียนทับข้อมูลที่มีอยู่ทั้งหมดใน Health Connect ตราบใดที่มีค่า clientRecordId อยู่ในที่เก็บข้อมูล Health Connect และ clientRecordVersion สูงกว่าค่าที่มีอยู่ มิเช่นนั้น ระบบจะเขียนข้อมูลที่อัปเดตเป็นข้อมูลใหม่

    healthConnectClient.insertRecords(arrayListOf(record))
    

ดูข้อมูลเกี่ยวกับข้อควรพิจารณาที่เป็นประโยชน์สำหรับการป้อนข้อมูลได้ที่แนวทางปฏิบัติแนะนำสำหรับเขียนข้อมูล

จัดเก็บรหัส Health Connect

หลังจากอัปโหลดระเบียนไปยัง Health Connect แล้ว ดาต้าสตोरของแอปจะต้องจัดเก็บ id ของ Health Connect สำหรับแต่ละระเบียน ซึ่งจะช่วยให้แอปตรวจสอบได้ว่าจะต้องมีการสร้างระเบียนใหม่หรืออัปเดตระเบียนที่มีอยู่หลังจากดึงข้อมูลแล้วสำหรับการเปลี่ยนแปลงขาเข้าแต่ละรายการ

ฟังก์ชัน insertRecords จะแสดงผล InsertRecordsResponse ที่มีรายการค่า id ใช้การตอบกลับเพื่อรับรหัสระเบียนและจัดเก็บ

val response = healthConnectClient.insertRecords(arrayListOf(record))

for (recordId in response.recordIdsList) {
    // Store recordId to your app's datastore
}

ดึงข้อมูลจาก Health Connect

ส่วนที่สองของกระบวนการซิงค์คือการดึงข้อมูลการเปลี่ยนแปลงจาก Health Connect ไปยังที่เก็บข้อมูลของแอป การเปลี่ยนแปลงข้อมูลอาจรวมถึงการอัปเดตและการลบ

รับโทเค็นการเปลี่ยนแปลง

หากต้องการดูรายการการเปลี่ยนแปลงที่จะดึงมาจาก Health Connect แอปของคุณจะต้องติดตามโทเค็นการเปลี่ยนแปลง คุณสามารถใช้โทเค็นเหล่านี้เมื่อขอการเปลี่ยนแปลงเพื่อแสดงทั้งรายการการเปลี่ยนแปลงข้อมูลและโทเค็นการเปลี่ยนแปลงใหม่ที่จะนําไปใช้ในครั้งถัดไป

หากต้องการรับโทเค็นการเปลี่ยนแปลง ให้เรียกใช้ getChangesToken และระบุประเภทข้อมูลที่จำเป็น

val changesToken = healthConnectClient.getChangesToken(
    ChangesTokenRequest(recordTypes = setOf(WeightRecord::class))
)

ตรวจสอบการเปลี่ยนแปลงข้อมูล

เมื่อได้รับโทเค็นการเปลี่ยนแปลงแล้ว ให้ใช้โทเค็นดังกล่าวเพื่อรับการเปลี่ยนแปลงทั้งหมด เราขอแนะนำให้สร้างลูปเพื่อดูการเปลี่ยนแปลงทั้งหมด ซึ่งจะตรวจสอบว่ามีการเปลี่ยนแปลงข้อมูลหรือไม่ ขั้นตอนมีดังนี้

  1. เรียกใช้ getChanges โดยใช้โทเค็นเพื่อรับรายการการเปลี่ยนแปลง
  2. ตรวจสอบการเปลี่ยนแปลงแต่ละรายการว่าประเภทการเปลี่ยนแปลงเป็น UpsertionChange หรือ DeletionChange แล้วดำเนินการที่จำเป็น
    • สำหรับ UpsertionChange ให้ใช้เฉพาะการเปลี่ยนแปลงที่ไม่ได้มาจากแอปโทรเพื่อให้แน่ใจว่าคุณไม่ได้นำเข้าข้อมูลซ้ำ
  3. กําหนดโทเค็น Changes รายการถัดไปเป็นโทเค็นใหม่
  4. ทำขั้นตอนที่ 1-3 ซ้ำจนกว่าจะไม่มีการเปลี่ยนแปลงเหลืออยู่
  5. จัดเก็บโทเค็นถัดไปและสำรองไว้สำหรับการนำเข้าในอนาคต
suspend fun processChanges(token: String): String {
    var nextChangesToken = token
    do {
        val response = healthConnectClient.getChanges(nextChangesToken)
        response.changes.forEach { change ->
            when (change) {
                is UpsertionChange ->
                    if (change.record.metadata.dataOrigin.packageName != context.packageName) {
                        processUpsertionChange(change)
                    }
                is DeletionChange -> processDeletionChange(change)
            }
        }
        nextChangesToken = response.nextChangesToken
    } while (response.hasMore)
    // Return and store the changes token for use next time.
    return nextChangesToken
}

ดูข้อมูลเกี่ยวกับข้อควรพิจารณาที่เป็นประโยชน์ในการดึงข้อมูลได้ที่แนวทางปฏิบัติแนะนำสำหรับซิงค์ข้อมูล

ประมวลผลการเปลี่ยนแปลงข้อมูล

แสดงการเปลี่ยนแปลงในดาต้าสตोरของแอป สําหรับ UpsertionChange ให้ใช้ id และ lastModifiedTime จาก metadata เพื่ออัปเดตระเบียน สำหรับ DeletionChange ให้ใช้ id ที่ระบุเพื่อลบระเบียน

ลบข้อมูลจาก Health Connect

เมื่อผู้ใช้ลบข้อมูลของตนเองออกจากแอป โปรดตรวจสอบว่าข้อมูลดังกล่าวถูกนำออกจาก Health Connect ด้วย ใช้ deleteRecords เพื่อทำเช่นนี้ ซึ่งจะใช้ประเภทระเบียนและรายการค่า id และ clientRecordId ซึ่งทำให้ลบข้อมูลหลายรายการพร้อมกันได้สะดวก นอกจากนี้ยังมี deleteRecords ทางเลือกที่ใช้ timeRangeFilter ได้ด้วย

แนวทางปฏิบัติแนะนำสำหรับการซิงค์ข้อมูล

ปัจจัยต่อไปนี้มีผลต่อกระบวนการซิงค์

การหมดอายุของโทเค็น

เนื่องจากโทเค็นการเปลี่ยนแปลงที่ไม่ได้ใช้จะหมดอายุภายใน 30 วัน คุณจึงต้องใช้กลยุทธ์การซิงค์ที่ป้องกันไม่ให้ข้อมูลสูญหายในกรณีดังกล่าว กลยุทธ์ของคุณอาจใช้แนวทางต่อไปนี้

  • ค้นหาที่เก็บข้อมูลแอปเพื่อหาระเบียนที่บริโภคล่าสุดซึ่งมี id จาก Health Connect ด้วย
  • ขอระเบียนจาก Health Connect ที่ขึ้นต้นด้วยการประทับเวลาที่ต้องการ จากนั้นแทรกหรืออัปเดตระเบียนในที่เก็บข้อมูลของแอป
  • ขอโทเค็นการเปลี่ยนแปลงเพื่อจองไว้ใช้ครั้งถัดไป

กลยุทธ์การจัดการการเปลี่ยนแปลงที่แนะนํา

ในกรณีที่แอปของคุณได้รับโทเค็นการเปลี่ยนแปลงที่ไม่ถูกต้องหรือหมดอายุ เราขอแนะนํากลยุทธ์การจัดการต่อไปนี้โดยขึ้นอยู่กับการใช้งานในตรรกะของคุณ

  • อ่านและกรองข้อมูลซ้ำทั้งหมด ซึ่งเป็นกลยุทธ์ที่เหมาะสมที่สุด
    • จัดเก็บการประทับเวลาของครั้งล่าสุดที่แอปอ่านข้อมูลจาก Health Connect
    • เมื่อโทเค็นหมดอายุ ให้อ่านข้อมูลทั้งหมดอีกครั้งจากการประทับเวลาล่าสุดหรือในช่วง 30 วันที่ผ่านมา จากนั้นกรองข้อมูลที่ซ้ำกันออกโดยใช้ตัวระบุเทียบกับข้อมูลที่อ่านก่อนหน้านี้
    • เราขอแนะนำให้ใช้รหัสไคลเอ็นต์ เนื่องจากรหัสดังกล่าวจําเป็นสําหรับการอัปเดตข้อมูล
  • อ่านเฉพาะข้อมูลจากการประทับเวลาการอ่านครั้งล่าสุด ด้วยเหตุนี้ ข้อมูลจึงมีความคลาดเคลื่อนบ้างในช่วงที่โทเค็นการเปลี่ยนแปลงหมดอายุ แต่ระยะเวลาจะสั้นลงโดยอาจใช้เวลา 2-3 ชั่วโมงถึง 2-3 วัน
    • จัดเก็บการประทับเวลาของครั้งล่าสุดที่แอปอ่านข้อมูลจาก Health Connect
    • เมื่อโทเค็นหมดอายุ ให้อ่านข้อมูลทั้งหมดนับจากการประทับเวลานี้เป็นต้นไป
  • ลบแล้วอ่านข้อมูลในช่วง 30 วันที่ผ่านมา วิธีนี้สอดคล้องกับสิ่งที่เกิดขึ้นในการผสานรวมครั้งแรกมากกว่า
    • ลบข้อมูลทั้งหมดที่แอปอ่านจาก Health Connect ในช่วง 30 วันที่ผ่านมา
    • เมื่อลบแล้ว ให้อ่านข้อมูลทั้งหมดนี้อีกครั้ง
  • อ่านข้อมูลในช่วง 30 วันที่ผ่านมาโดยไม่กรองข้อมูลที่ซ้ำกันออก นี่เป็นกลยุทธ์ที่ไม่เหมาะที่สุดและส่งผลให้มีข้อมูลที่ซ้ำกันแสดงต่อผู้ใช้
    • ลบข้อมูลทั้งหมดที่แอปอ่านจาก Health Connect ในช่วง 30 วันที่ผ่านมา
    • อนุญาตให้ป้อนรายการซ้ำ

โทเค็นการเปลี่ยนแปลงประเภทข้อมูล

หากแอปใช้ข้อมูลมากกว่า 1 ประเภทแยกกัน ให้ใช้ Changes Token แยกกันสำหรับข้อมูลแต่ละประเภท ใช้รายการข้อมูลหลายประเภทกับ Changes Sync API เฉพาะในกรณีที่จะใช้ข้อมูลประเภทเหล่านี้ร่วมกันหรือไม่ใช้เลย

การอ่านในเบื้องหน้า

แอปจะอ่านข้อมูลจาก Health Connect ได้ก็ต่อเมื่อแอปอยู่เบื้องหน้าเท่านั้น เมื่อซิงค์ข้อมูลจาก Health Connect การเข้าถึง Health Connect อาจถูกขัดจังหวะได้ทุกเมื่อ ตัวอย่างเช่น แอปต้องจัดการการหยุดชะงักขณะซิงค์ไปครึ่งทางเมื่ออ่านข้อมูลจำนวนมากจาก Health Connect และดำเนินการต่อเมื่อเปิดแอปครั้งถัดไป

การอ่านในเบื้องหลัง

คุณสามารถขอให้แอปพลิเคชันทำงานในเบื้องหลังและอ่านข้อมูลจาก Health Connect หากคุณขอสิทธิ์ Background Read ผู้ใช้จะอนุญาตให้แอปของคุณอ่านข้อมูลในเบื้องหลังได้

นำเข้าการกำหนดเวลา

เนื่องจากแอปของคุณไม่สามารถรับการแจ้งเตือนข้อมูลใหม่ ให้ตรวจสอบข้อมูลใหม่ใน 2 จุดดังนี้

  • ทุกครั้งที่แอปทำงานอยู่เบื้องหน้า ในกรณีนี้ ให้ใช้เหตุการณ์ในวงจรของลูกค้า
  • เป็นระยะๆ ขณะที่แอปทำงานอยู่เบื้องหน้า แจ้งผู้ใช้เมื่อมีข้อมูลใหม่ เพื่อให้ผู้ใช้อัปเดตหน้าจอให้สอดคล้องกับการเปลี่ยนแปลง