ডেটা লিখুন

এই নির্দেশিকাটি হেলথ কানেক্ট সংস্করণ 1.1.0-alpha12 এর সাথে সামঞ্জস্যপূর্ণ।

এই নির্দেশিকায় হেলথ কানেক্ট-এ ডেটা লেখা বা আপডেট করার প্রক্রিয়া বর্ণনা করা হয়েছে।

শূন্য মান পরিচালনা করুন

স্টেপস, ডিসটেন্স বা ক্যালোরির মতো কিছু ডেটা টাইপের মান 0 হতে পারে। শুধুমাত্র তখনই শূন্য মান লিখুন, যখন এটি ব্যবহারকারী ডিভাইসটি পরিধান করার সময় প্রকৃত নিষ্ক্রিয়তাকে প্রতিফলিত করে। যদি ডিভাইসটি পরিধান করা না হয়ে থাকে, ডেটা অনুপস্থিত থাকে বা ব্যাটারি শেষ হয়ে যায়, তবে শূন্য মান লিখবেন না। এই ধরনের ক্ষেত্রে, বিভ্রান্তিকর ডেটা এড়াতে রেকর্ডটি বাদ দিন।

ডেটা কাঠামো সেট আপ করুন

ডেটা লেখার আগে, আমাদের প্রথমে রেকর্ডগুলো সেট আপ করতে হবে। ৫০টিরও বেশি ডেটা টাইপের প্রত্যেকটির নিজস্ব কাঠামো রয়েছে। উপলব্ধ ডেটা টাইপগুলো সম্পর্কে আরও বিস্তারিত জানতে জেটপ্যাক রেফারেন্স দেখুন।

মৌলিক রেকর্ড

হেলথ কানেক্ট-এর স্টেপস ডেটা টাইপটি দুটি রিডিংয়ের মধ্যবর্তী সময়ে একজন ব্যবহারকারীর নেওয়া পদক্ষেপের সংখ্যা রেকর্ড করে। স্বাস্থ্য, ফিটনেস এবং সুস্থতা প্ল্যাটফর্মগুলোতে পদক্ষেপের সংখ্যা একটি প্রচলিত পরিমাপ।

নিচের উদাহরণটিতে দেখানো হয়েছে কীভাবে ধাপ সংখ্যার ডেটা সেট করতে হয়:

val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime)
val stepsRecord = StepsRecord(
    count = 120,
    startTime = startTime,
    endTime = endTime,
    startZoneOffset = zoneOffset,
    endZoneOffset = zoneOffset,
    metadata = Metadata(
        device = Device(type = Device.TYPE_WATCH),
        recordingMethod = Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED
    )
)
healthConnectClient.insertRecords(listOf(stepsRecord))

পরিমাপের একক সহ রেকর্ড

সঠিকতা নিশ্চিত করার জন্য হেলথ কানেক্ট পরিমাপের এককসহ মানগুলো সংরক্ষণ করতে পারে। এর একটি উদাহরণ হলো নিউট্রিশন ডেটা টাইপ, যা অত্যন্ত ব্যাপক ও বিস্তৃত। এতে মোট কার্বোহাইড্রেট থেকে শুরু করে ভিটামিন পর্যন্ত বিভিন্ন ধরনের ঐচ্ছিক পুষ্টি উপাদানের ফিল্ড অন্তর্ভুক্ত রয়েছে। প্রতিটি ডেটা পয়েন্ট কোনো খাবার বা খাদ্যদ্রব্যের অংশ হিসেবে সম্ভাব্যভাবে গ্রহণ করা পুষ্টি উপাদানগুলোকে নির্দেশ করে।

এই ডেটা টাইপে, সমস্ত পুষ্টি উপাদানকে ভর এককে এবং energy শক্তি এককে প্রকাশ করা হয়।

নিম্নলিখিত উদাহরণটি দেখায় যে, একজন ব্যবহারকারী কলা খাওয়ার পর তার পুষ্টির তথ্য কীভাবে সেট করতে হয়:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(1))

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 = startTime,
    endTime = endTime,
    startZoneOffset = ZoneOffset.UTC,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata(
        device = Device(type = Device.TYPE_PHONE)
    )
)

সিরিজ ডেটা সহ রেকর্ড

হেলথ কানেক্ট সিরিজ ডেটার একটি তালিকা সংরক্ষণ করতে পারে। এর একটি উদাহরণ হলো হার্ট রেট ডেটা টাইপ, যা দুটি রিডিংয়ের মধ্যবর্তী সময়ে শনাক্ত হওয়া হৃদস্পন্দনের ধারাবাহিক নমুনা ধারণ করে।

এই ডেটা টাইপে, ' samples প্যারামিটারটি হার্ট রেট স্যাম্পলগুলোর একটি তালিকা দ্বারা উপস্থাপিত হয়। প্রতিটি স্যাম্পলে একটি beatsPerMinute মান এবং একটি time মান থাকে।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে হার্ট রেট সিরিজ ডেটা সেট করতে হয়:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(5))

val heartRateRecord = HeartRateRecord(
    startTime = startTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = endTime,
    endZoneOffset = ZoneOffset.UTC,
    // records 10 arbitrary data, to replace with actual data
    samples = List(10) { index ->
        HeartRateRecord.Sample(
            time = startTime + Duration.ofSeconds(index.toLong()),
            beatsPerMinute = 100 + index.toLong(),
        )
    },
    metadata = Metadata(
        device = Device(type = Device.TYPE_WATCH)
    ))

ব্যবহারকারীর কাছ থেকে অনুমতি অনুরোধ করুন

একটি ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পর, আপনার অ্যাপকে ব্যবহারকারীর কাছ থেকে অনুমতির জন্য অনুরোধ করতে হবে। ব্যবহারকারীদের যেকোনো সময় অনুমতি প্রদান বা প্রত্যাখ্যান করার ক্ষমতা থাকতে হবে।

এটি করার জন্য, প্রয়োজনীয় ডেটা টাইপগুলোর জন্য এক সেট পারমিশন তৈরি করুন। প্রথমে নিশ্চিত করুন যে, সেটের অন্তর্ভুক্ত পারমিশনগুলো আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে ঘোষিত হয়েছে।

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::class)
)

আপনার অ্যাপে প্রয়োজনীয় অনুমতিগুলো আগে থেকেই দেওয়া আছে কিনা তা দেখতে getGrantedPermissions ব্যবহার করুন। যদি না থাকে, তাহলে সেই অনুমতিগুলোর জন্য অনুরোধ করতে createRequestPermissionResultContract ব্যবহার করুন। এটি হেলথ কানেক্ট পারমিশন স্ক্রিনটি প্রদর্শন করবে।

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

যেহেতু ব্যবহারকারীরা যেকোনো সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে প্রতিবার ব্যবহারের আগে অনুমতি যাচাই করতে হবে এবং অনুমতি হারিয়ে গেলে তার মোকাবিলা করতে হবে।

ডেটা লিখুন

হেলথ কানেক্ট-এর অন্যতম একটি প্রচলিত কার্যপ্রবাহ হলো ডেটা লেখা। রেকর্ড যোগ করতে insertRecords ব্যবহার করুন।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে ডেটা সন্নিবেশ করার ধাপ সংখ্যা লিখতে হয়:

val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime)
val stepsRecord = StepsRecord(
    count = 120,
    startTime = startTime,
    endTime = endTime,
    startZoneOffset = zoneOffset,
    endZoneOffset = zoneOffset,
    metadata = Metadata(
        device = Device(type = Device.TYPE_WATCH),
        recordingMethod = Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED
    )
)
healthConnectClient.insertRecords(listOf(stepsRecord))

ডেটা আপডেট করুন

যদি আপনার এক বা একাধিক রেকর্ড পরিবর্তন করার প্রয়োজন হয়, বিশেষ করে যখন হেলথ কানেক্ট-এর ডেটার সাথে আপনার অ্যাপ ডেটাস্টোর সিঙ্ক করার প্রয়োজন হয়, তখন আপনি আপনার ডেটা আপডেট করতে পারেন। বিদ্যমান ডেটা আপডেট করার দুটি উপায় রয়েছে, যা রেকর্ড খুঁজে বের করার জন্য ব্যবহৃত আইডেন্টিফায়ারের উপর নির্ভর করে।

মেটাডেটা

প্রথমে Metadata ক্লাসটি পরীক্ষা করে দেখা উচিত, কারণ ডেটা আপডেট করার সময় এটি প্রয়োজনীয়। হেলথ কানেক্ট-এর প্রতিটি Record তৈরির সময় একটি metadata ফিল্ড থাকে। নিম্নলিখিত প্রোপার্টিগুলো সিনক্রোনাইজেশনের জন্য প্রাসঙ্গিক:

বৈশিষ্ট্য বর্ণনা
id হেলথ কানেক্ট-এর প্রতিটি Record একটি অনন্য id ভ্যালু থাকে।
নতুন রেকর্ড যোগ করার সময় হেলথ কানেক্ট স্বয়ংক্রিয়ভাবে এটি পূরণ করে দেয়
lastModifiedTime প্রতিটি Record শেষবার কখন পরিবর্তন করা হয়েছিল তারও হিসাব রাখে।
হেলথ কানেক্ট স্বয়ংক্রিয়ভাবে এটি পূরণ করে।
clientRecordId আপনার অ্যাপ ডেটাস্টোরে রেফারেন্স হিসেবে ব্যবহারের জন্য প্রতিটি Record সাথে একটি অনন্য আইডি যুক্ত থাকতে পারে।
আপনার অ্যাপ এই মানটি সরবরাহ করে।
clientRecordVersion যেখানে কোনো রেকর্ডের clientRecordId থাকে, সেখানে আপনার অ্যাপ ডেটাস্টোরের ভার্সনের সাথে ডেটা সিঙ্ক করে রাখার জন্য clientRecordVersion ব্যবহার করা যেতে পারে।
আপনার অ্যাপ এই মানটি সরবরাহ করে।

সময়সীমা অনুসারে পড়ার পরে আপডেট করুন

ডেটা আপডেট করতে, প্রথমে প্রয়োজনীয় রেকর্ডগুলো প্রস্তুত করুন। প্রয়োজনে রেকর্ডগুলোতে যেকোনো পরিবর্তন করুন। তারপর, পরিবর্তনগুলো কার্যকর করতে updateRecords কল করুন।

নিম্নলিখিত উদাহরণটি ডেটা আপডেট করার পদ্ধতি দেখায়। এই উদ্দেশ্যে, প্রতিটি রেকর্ডের জোন অফসেট মান PST-তে সমন্বয় করা হয়।

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)
        }

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

ক্লায়েন্ট রেকর্ড আইডির মাধ্যমে আপসার্ট করুন

আপনি যদি ঐচ্ছিক ক্লায়েন্ট রেকর্ড আইডি এবং ক্লায়েন্ট রেকর্ড ভার্সন ভ্যালুগুলো ব্যবহার করেন, তাহলে আমরা updateRecords এর পরিবর্তে insertRecords ব্যবহার করার পরামর্শ দিই।

insertRecords ফাংশনটির ডেটা আপসার্ট করার ক্ষমতা রয়েছে। প্রদত্ত ক্লায়েন্ট রেকর্ড আইডিগুলোর ওপর ভিত্তি করে যদি হেলথ কানেক্ট-এ ডেটা আগে থেকেই থাকে, তবে তা ওভাররাইট হয়ে যায়। অন্যথায়, এটি নতুন ডেটা হিসেবে লেখা হয়। যখনই আপনার অ্যাপ ডেটাস্টোর থেকে হেলথ কানেক্ট-এ ডেটা সিঙ্ক করার প্রয়োজন হয়, তখন এই ব্যবস্থাটি কাজে আসে।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে অ্যাপ ডেটাস্টোর থেকে আনা ডেটার উপর আপসার্ট (upsert) সম্পাদন করতে হয়:

suspend fun pullStepsFromDatastore(startTime: Instant, endTime: Instant) : ArrayList<StepsRecord> {
    val appStepsRecords = arrayListOf<StepsRecord>()
    // Pull data from app datastore
    // ...
    // Make changes to data if necessary
    // ...
    // Store data in appStepsRecords
    // ...
    var sr = StepsRecord(
        metadata = Metadata(
            clientRecordId = "Your client record ID",
            device = Device(type = Device.TYPE_WATCH)
        ),
        startTime = startTime,
        startZoneOffset = startTime.atZone(ZoneId.of("PST")).offset,
        endTime = endTime,
        endZoneOffset = endTime.atZone(ZoneId.of("PST")).offset,
        count = 120
    )
    appStepsRecords.add(sr)
    // ...
    return appStepsRecords
}

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

এরপরে, আপনি আপনার প্রধান থ্রেডে এই ফাংশনগুলো কল করতে পারবেন।

upsertSteps(healthConnectClient, pullStepsFromDatastore(
    startTime = startTime,
    endTime = endTime
))

ক্লায়েন্ট রেকর্ড সংস্করণে মান যাচাই

আপনার ডেটা আপসার্ট করার প্রক্রিয়ায় যদি ক্লায়েন্ট রেকর্ড ভার্সন অন্তর্ভুক্ত থাকে, তাহলে হেলথ কানেক্ট ` clientRecordVersion ভ্যালুগুলোর মধ্যে তুলনা করে। যদি ইনসার্ট করা ডেটার ভার্সনটি বিদ্যমান ডেটার ভার্সনের চেয়ে বেশি হয়, তাহলে আপসার্টটি সম্পন্ন হয়। অন্যথায়, প্রক্রিয়াটি পরিবর্তনটিকে উপেক্ষা করে এবং ভ্যালুটি অপরিবর্তিত থাকে।

আপনার ডেটাতে ভার্সনিং অন্তর্ভুক্ত করতে, আপনার ভার্সনিং লজিকের উপর ভিত্তি করে Metadata.clientRecordVersion এ একটি Long ভ্যালু সরবরাহ করতে হবে।

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(15))

val stepsRecord = StepsRecord(
    count = 100L,
    startTime = startTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = endTime,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata(
        clientRecordId = "Your supplied record ID",
        clientRecordVersion = 0L, // Your supplied record version
        device = Device(type = Device.TYPE_WATCH)
    )
)

পরিবর্তনের সাথে সাথে আপসার্ট স্বয়ংক্রিয়ভাবে version বাড়ায় না, ফলে ডেটা ওভাররাইট হওয়ার কোনো অপ্রত্যাশিত ঘটনা ঘটে না। একারণে, আপনাকে ম্যানুয়ালি একটি উচ্চতর মান সরবরাহ করতে হয়।

সাধারণ নির্দেশিকা

আপনার অ্যাপের উচিত সমস্ত সমর্থিত ফার্স্ট-পার্টি ডেটা লেখা। ঐচ্ছিকভাবে, আপনি আপনার অ্যাপকে থার্ড-পার্টি উৎস থেকে প্রাপ্ত ডেটাও লিখতে দিতে পারেন। তবে, যদি আপনার অ্যাপ হেলথ কানেক্ট থেকে ডেটা পড়ে থাকে, তাহলে সেই ডেটা হেলথ কানেক্ট-এ পুনরায় লেখা উচিত নয়।

অন্য কোনো উৎস থেকে আমদানি করা বা প্রাপ্ত ডেটা লেখার সময়, আপনাকে এর উৎস এবং উৎস ডিভাইসের মেটাডেটা সঠিকভাবে উল্লেখ করতে হবে। এটি করার জন্য, আপনাকে প্রতিটি লিখিত রেকর্ডের জন্য নিম্নলিখিত মেটাডেটা সরবরাহ করতে হবে:

  • recordingMethod : স্বয়ংক্রিয়ভাবে বা ম্যানুয়ালি রেকর্ড করা ডেটার জন্য, আমরা আশা করি যে রেকর্ড করা কার্যকলাপের ধরন প্রতিফলিত করার জন্য রেকর্ডিং পদ্ধতিটি আপডেট করা হবে:
    • RECORDING_METHOD_AUTOMATICALLY_RECORDED স্বয়ংক্রিয়ভাবে রেকর্ড করা হয়েছে : যদি ডেটা স্বয়ংক্রিয়ভাবে রেকর্ড করা হয়ে থাকে, উদাহরণস্বরূপ, একটি ফিটনেস ব্যান্ড স্বয়ংক্রিয়ভাবে শনাক্ত করে যে ব্যবহারকারী দৌড়াতে গিয়েছিলেন।
    • RECORDING_METHOD_ACTIVELY_RECORDED : যদি ব্যবহারকারী কোনো নতুন কার্যকলাপ শুরু করে থাকেন, যেমন তাঁর পরিধানযোগ্য ডিভাইসটিতে বাইক চালানো।
    • RECORDING_METHOD_MANUAL_ENTRY : ম্যানুয়াল এন্ট্রি : যদি ব্যবহারকারী ডেটা ম্যানুয়ালি প্রবেশ করিয়ে থাকেন।
  • device.type : আপনাকে সমর্থিত Device টাইপগুলো থেকে একটি ডিভাইস টাইপ নির্দিষ্ট করতে হবে।
  • device.manufacturer : ডিভাইসটির প্রস্তুতকারক, উদাহরণস্বরূপ, 'ফিটবিট'।
  • device.model : ডিভাইসটির মডেল, যেমন, 'Charge 3'।

ডেটার স্বচ্ছতার জন্য মেটাডেটা সঠিকভাবে সেট করা অত্যন্ত গুরুত্বপূর্ণ এবং এটি ব্যবহারকারীদের বুঝতে সাহায্য করে যে তাদের স্বাস্থ্য সম্পর্কিত তথ্য কোথা থেকে আসছে। সম্পূর্ণ বিবরণের জন্য, হেলথ কানেক্ট মেটাডেটা গাইডটি দেখুন।

যদি আপনার অ্যাপের ডেটা অন্য কোনো অ্যাপ থেকে ইম্পোর্ট করা হয়ে থাকে, তাহলে হেলথ কানেক্ট-এ নিজস্ব ডেটা লেখার দায়িত্ব সেই অন্য অ্যাপটির ওপর বর্তায়।

ডেটা সীমার বাইরে চলে যাওয়া বা কোনো অভ্যন্তরীণ সিস্টেম ত্রুটির মতো রাইট এক্সেপশনগুলো সামলানোর জন্য লজিক প্রয়োগ করাও একটি ভালো উপায়। আপনি একটি জব শিডিউলিং মেকানিজমে আপনার ব্যাকঅফ এবং রিট্রাই কৌশলগুলো প্রয়োগ করতে পারেন। যদি হেলথ কানেক্ট-এ লেখা শেষ পর্যন্ত অসফল হয়, তবে নিশ্চিত করুন যে আপনার অ্যাপটি এক্সপোর্টের সেই পর্যায়টি অতিক্রম করতে পারে। সমস্যা নির্ণয়ে সহায়তার জন্য ত্রুটিগুলো লগ এবং রিপোর্ট করতে ভুলবেন না।

ডেটা ট্র্যাক করার ক্ষেত্রে, আপনার অ্যাপ যেভাবে ডেটা লেখে তার ওপর নির্ভর করে আপনি কয়েকটি পরামর্শ অনুসরণ করতে পারেন।

সময় অঞ্চল পরিচালনা

সময়-ভিত্তিক রেকর্ড লেখার সময়, ডিফল্টরূপে অফসেট zoneOffset.UTC- তে সেট করা এড়িয়ে চলুন, কারণ ব্যবহারকারীরা অন্য জোনে থাকলে এর ফলে টাইমস্ট্যাম্প ভুল হতে পারে। এর পরিবর্তে, ডিভাইসের প্রকৃত অবস্থানের উপর ভিত্তি করে অফসেট গণনা করুন। আপনি ZoneId.systemDefault() ব্যবহার করে ডিভাইসের টাইম জোন জানতে পারবেন।

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofDays(1))
val stepsRecords = mutableListOf<StepsRecord>()
var sampleTime = startTime
val minutesBetweenSamples = 15L
while (sampleTime < endTime) {
    // Get the default ZoneId then convert it to an offset
    val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(sampleTime)
    stepsRecords += StepsRecord(
        startTime = sampleTime.minus(Duration.ofMinutes(minutesBetweenSamples)),
        startZoneOffset = zoneOffset,
        endTime = sampleTime,
        endZoneOffset = zoneOffset,
        count = Random.nextLong(1, 100),
        metadata = Metadata(),
    )
    sampleTime = sampleTime.plus(Duration.ofMinutes(minutesBetweenSamples))
}
healthConnectClient.insertRecords(
    stepsRecords
)

আরও বিস্তারিত তথ্যের জন্য ZoneId এর ডকুমেন্টেশন দেখুন।

লেখার ফ্রিকোয়েন্সি এবং গ্র্যানুলারিটি

হেলথ কানেক্ট-এ ডেটা লেখার সময় উপযুক্ত রেজোলিউশন ব্যবহার করুন। উপযুক্ত রেজোলিউশন ব্যবহার করলে স্টোরেজের উপর চাপ কমে, এবং একই সাথে ডেটার সামঞ্জস্য ও নির্ভুলতা বজায় থাকে। ডেটা রেজোলিউশনের মধ্যে দুটি বিষয় অন্তর্ভুক্ত:

  • লেখার পুনরাবৃত্তি : আপনার অ্যাপ্লিকেশনটি কত ঘন ঘন হেলথ কানেক্ট-এ নতুন ডেটা লেখে।
    • ডিভাইসের পারফরম্যান্সের দিকে খেয়াল রেখে, নতুন ডেটা পাওয়া গেলে যত ঘন ঘন সম্ভব তা লিখুন।
    • ব্যাটারির আয়ু এবং পারফরম্যান্সের অন্যান্য দিকের উপর নেতিবাচক প্রভাব এড়াতে, দুটি লেখার মধ্যে সর্বোচ্চ ব্যবধান ১৫ মিনিট হওয়া উচিত।
  • লিখিত তথ্যের সূক্ষ্মতা : কত ঘন ঘন তথ্য সংগ্রহ করা হয়েছিল।
    • উদাহরণস্বরূপ, প্রতি ৫ সেকেন্ডে হৃদস্পন্দনের নমুনা রেকর্ড করুন।
    • সব ধরনের ডেটার জন্য একই স্যাম্পল রেট প্রয়োজন হয় না। প্রতি ৬০ সেকেন্ডের মতো কম বিরতিতে স্টেপ কাউন্ট ডেটা আপডেট করার তুলনায়, প্রতি সেকেন্ডে তা আপডেট করার তেমন কোনো সুবিধা নেই।
    • উচ্চতর স্যাম্পল রেট ব্যবহারকারীদের তাদের স্বাস্থ্য ও ফিটনেস ডেটার আরও বিস্তারিত এবং সূক্ষ্ম চিত্র দিতে পারে। স্যাম্পল রেট ফ্রিকোয়েন্সির ক্ষেত্রে বিশদ বিবরণ এবং পারফরম্যান্সের মধ্যে একটি ভারসাম্য থাকা উচিত।

অতিরিক্ত নির্দেশিকা

ডেটা লেখার সময় এই নির্দেশিকাগুলো অনুসরণ করুন:

  • প্রতি সিঙ্কে, শুধুমাত্র নতুন ডেটা এবং শেষ সিঙ্কের পর পরিবর্তিত হওয়া আপডেট করা ডেটা লিখুন।
  • প্রতিটি রাইট রিকোয়েস্টে সর্বাধিক ১০০০টি রেকর্ড পর্যন্ত অনুরোধগুলো খণ্ড খণ্ড করে পাঠানো হয়।
  • ডিভাইসটি নিষ্ক্রিয় থাকলে এবং ব্যাটারি কম না থাকলেই কেবল টাস্কগুলো চালানোর জন্য সীমাবদ্ধ করুন।
  • ব্যাকগ্রাউন্ড টাস্কের জন্য, WorkManager ব্যবহার করে সর্বোচ্চ ১৫ মিনিটের সময়সীমা সহ পর্যায়ক্রমিক টাস্ক শিডিউল করুন।

নিম্নলিখিত কোডটি WorkManager ব্যবহার করে পর্যায়ক্রমিক ব্যাকগ্রাউন্ড টাস্ক শিডিউল করে, যার সর্বোচ্চ সময়কাল ১৫ মিনিট এবং ফ্লেক্স ইন্টারভাল ৫ মিনিট। এই কনফিগারেশনটি PeriodicWorkRequest.Builder ক্লাস ব্যবহার করে সেট করা হয়।

val constraints = Constraints.Builder()
    .requiresBatteryNotLow()
    .requiresDeviceIdle(true)
    .build()

val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>(
        15,
        TimeUnit.MINUTES,
        5,
        TimeUnit.MINUTES
    )
    .setConstraints(constraints)
    .build()

সক্রিয় ট্র্যাকিং

এর মধ্যে এমন অ্যাপগুলো অন্তর্ভুক্ত রয়েছে যেগুলো ব্যায়াম ও ঘুমের মতো ইভেন্ট-ভিত্তিক ট্র্যাকিং করে, অথবা পুষ্টির মতো ম্যানুয়াল ইউজার ইনপুট গ্রহণ করে। এই রেকর্ডগুলো তৈরি হয় যখন অ্যাপটি ফোরগ্রাউন্ডে থাকে, অথবা এমন বিরল ক্ষেত্রে যখন এটি দিনে কয়েকবার ব্যবহার করা হয়।

নিশ্চিত করুন যে আপনার অ্যাপটি ইভেন্টের সম্পূর্ণ সময়কাল জুড়ে হেলথ কানেক্ট চালু রাখছে না।

দুটি উপায়ের যেকোনো একটিতে হেলথ কানেক্ট-এ ডেটা লিখতে হবে:

  • ইভেন্টটি সম্পন্ন হওয়ার পর হেলথ কানেক্ট-এ ডেটা সিঙ্ক করুন। উদাহরণস্বরূপ, ব্যবহারকারী যখন একটি ট্র্যাক করা ব্যায়াম সেশন শেষ করেন, তখন ডেটা সিঙ্ক করুন।
  • পরবর্তীতে ডেটা সিঙ্ক করার জন্য WorkManager ব্যবহার করে একটি এককালীন টাস্ক শিডিউল করুন।

লেখার সূক্ষ্মতা এবং পুনরাবৃত্তির জন্য সর্বোত্তম অনুশীলন

হেলথ কানেক্ট-এ ডেটা লেখার সময় উপযুক্ত রেজোলিউশন ব্যবহার করুন। উপযুক্ত রেজোলিউশন ব্যবহার করলে স্টোরেজের উপর চাপ কমে, এবং একই সাথে ডেটার সামঞ্জস্য ও নির্ভুলতা বজায় থাকে। ডেটা রেজোলিউশনের মধ্যে দুটি বিষয় অন্তর্ভুক্ত:

  1. রাইট করার ফ্রিকোয়েন্সি : আপনার অ্যাপ্লিকেশনটি কত ঘন ঘন হেলথ কানেক্ট-এ নতুন ডেটা পাঠায়। ডিভাইসের পারফরম্যান্সের কথা মাথায় রেখে, নতুন ডেটা পাওয়া গেলেই যত ঘন ঘন সম্ভব ডেটা লিখুন। ব্যাটারির আয়ু এবং পারফরম্যান্সের অন্যান্য দিকের উপর নেতিবাচক প্রভাব এড়াতে, দুটি রাইটের মধ্যে সর্বোচ্চ ব্যবধান ১৫ মিনিট হওয়া উচিত।

  2. লিখিত ডেটার সূক্ষ্মতা : ইনপুট করা ডেটা কত ঘন ঘন স্যাম্পল করা হয়েছে। উদাহরণস্বরূপ, প্রতি ৫ সেকেন্ডে হার্ট রেটের স্যাম্পল লেখা। সব ধরনের ডেটার জন্য একই স্যাম্পল রেটের প্রয়োজন হয় না। প্রতি সেকেন্ডে স্টেপ কাউন্ট ডেটা আপডেট করার চেয়ে, প্রতি ৬০ সেকেন্ডের মতো কম ঘন ঘন আপডেট করা বেশি সুবিধাজনক। তবে, উচ্চ স্যাম্পল রেট ব্যবহারকারীদের তাদের স্বাস্থ্য ও ফিটনেস ডেটার আরও বিস্তারিত এবং সূক্ষ্ম চিত্র দিতে পারে। স্যাম্পল রেটের ফ্রিকোয়েন্সি বিশদ বিবরণ এবং পারফরম্যান্সের মধ্যে একটি ভারসাম্য বজায় রাখা উচিত।

সিরিজ ডেটার জন্য কাঠামোগত রেকর্ড

HeartRateRecord -এর মতো যে ডেটা টাইপগুলো একাধিক স্যাম্পল ব্যবহার করে, সেগুলোর ক্ষেত্রে রেকর্ডগুলো সঠিকভাবে সাজানো জরুরি। ক্রমাগত আপডেট হতে থাকা একটিমাত্র দিনব্যাপী রেকর্ড তৈরি করার পরিবর্তে, আপনার উচিত একাধিক ছোট ছোট রেকর্ড তৈরি করা, যার প্রতিটি একটি নির্দিষ্ট সময়কালকে প্রতিনিধিত্ব করবে।

উদাহরণস্বরূপ, হৃদস্পন্দনের ডেটার জন্য, আপনাকে প্রতি মিনিটের জন্য একটি নতুন HeartRateRecord তৈরি করতে হবে। প্রতিটি রেকর্ডে সেই মিনিট জুড়ে একটি শুরুর সময় এবং শেষের সময় থাকবে এবং এতে সেই মিনিটে ধারণ করা সমস্ত হৃদস্পন্দনের নমুনা অন্তর্ভুক্ত থাকবে।

হেলথ কানেক্ট-এর সাথে নিয়মিত সিঙ্ক করার সময় (উদাহরণস্বরূপ, প্রতি ১৫ মিনিটে), আপনার অ্যাপের উচিত আগের সিঙ্কের পর থেকে তৈরি হওয়া সমস্ত এক মিনিটের রেকর্ড লিখে রাখা। এটি রেকর্ডগুলোকে একটি সহনীয় আকারে রাখে এবং ডেটা কোয়েরি ও প্রসেস করার পারফরম্যান্স উন্নত করে।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একাধিক নমুনা সহ এক মিনিটের জন্য একটি HeartRateRecord তৈরি করতে হয়:

val startTime = Instant.now().truncatedTo(ChronoUnit.MINUTES)
val endTime = startTime.plus(Duration.ofMinutes(1))

val heartRateRecord = HeartRateRecord(
    startTime = startTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = endTime,
    endZoneOffset = ZoneOffset.UTC,
    // Create a new record every minute, containing a list of samples.
    samples = listOf(
        HeartRateRecord.Sample(
            time = startTime + Duration.ofSeconds(15),
            beatsPerMinute = 80,
        ),
        HeartRateRecord.Sample(
            time = startTime + Duration.ofSeconds(30),
            beatsPerMinute = 82,
        ),
        HeartRateRecord.Sample(
            time = startTime + Duration.ofSeconds(45),
            beatsPerMinute = 85,
        )
    ),
    metadata = Metadata(
        device = Device(type = Device.TYPE_WATCH)
    ))

সারাদিন ধরে পর্যবেক্ষণ করা ডেটা লিখুন।

পদক্ষেপের মতো ক্রমাগত সংগৃহীত ডেটার ক্ষেত্রে, নতুন ডেটা উপলব্ধ হলে আপনার অ্যাপ্লিকেশনটির উচিত যত ঘন ঘন সম্ভব হেলথ কানেক্ট-এ লেখা। ব্যাটারির আয়ু এবং অন্যান্য পারফরম্যান্সের উপর নেতিবাচক প্রভাব এড়াতে, দুটি লেখার মধ্যে সর্বোচ্চ ব্যবধান ১৫ মিনিট হওয়া উচিত।

সারণি ১: ডেটা লেখার নির্দেশিকা

ডেটা টাইপ

ইউনিট

প্রত্যাশিত

উদাহরণ

পদক্ষেপ

পদক্ষেপ

প্রতি ১ মিনিটে

২৩:১৪ - ২৩:১৫ - ৫টি ধাপ

২৩:১৬ - ২৩:১৭ - ২২ ধাপ

২৩:১৭ - ২৩:১৮ - ৮টি ধাপ

স্টেপস ক্যাডেন্স

পদক্ষেপ/মিনিট

প্রতি ১ মিনিটে

২৩:১৪ - ২৩:১৫ - ৫ এসপিএম

২৩:১৬ - ২৩:১৭ - ২২ এসপিএম

২৩:১৭ - ২৩:১৮ - ৮ এসপিএম

হুইলচেয়ার ধাক্কা দেয়

ধাক্কা

প্রতি ১ মিনিটে

২৩:১৪ - ২৩:১৫ - ৫টি ধাক্কা

২৩:১৬ - ২৩:১৭ - ২২ টি ধাক্কা

২৩:১৭ - ২৩:১৮ - ৮টি ধাক্কা

সক্রিয় ক্যালোরি পোড়ানো

ক্যালোরি

প্রতি ১৫ মিনিট পর পর

২৩:১৫ - ২৩:৩০ - ২ ক্যালোরি

২৩:৩০ - ২৩:৪৫ - ২৫ ক্যালোরি

২৩:৪৫ - ০০:০০ - ৫ ক্যালোরি

মোট ক্যালোরি খরচ

ক্যালোরি

প্রতি ১৫ মিনিট পর পর

২৩:১৫ - ২৩:৩০ - ১৬ ক্যালোরি

২৩:৩০ - ২৩:৪৫ - ১৬ ক্যালোরি

২৩:৪৫ - ০০:০০ - ১৬ ক্যালোরি

দূরত্ব

কিমি/মিনিট

প্রতি ১ মিনিটে

২৩:১৪-২৩:১৫ - ০.০০৮ কিমি

২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি

২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি

উচ্চতা বৃদ্ধি

এম

প্রতি ১ মিনিটে

২০:৩৬ - ২০:৩৭ - ৩.০৪৮ মিটার

২০:৩৯ - ২০:৪০ - ৩.০৪৮ মিটার

২৩:২৩ - ২৩:২৪ - ৯.১৪৪ মিটার

ফ্লোরসক্লাইম্বড

মেঝে

প্রতি ১ মিনিটে

২৩:১৪ - ২৩:১৫ - ৫ তলা

২৩:১৬ - ২৩:১৬ - ২২ তলা

২৩:১৭ - ২৩:১৮ - ৮ তলা

হৃদস্পন্দন

বিপিএম

মিনিটে ৪ বার

সকাল ৬:১১:১৫ - ৫৫ বিপিএম

সকাল ৬:১১:৩০ - ৫৬ বিপিএম

সকাল ৬:১১:৪৫ - ৫৬ বিপিএম

সকাল ৬:১২:০০ - ৫৫ বিপিএম

হার্টরেটভেরিয়াবিলিটিআরএমএসএসডি

এমএস

প্রতি ১ মিনিটে

সকাল ৬:১১ - ২৩ মিলিসেকেন্ড

শ্বাসপ্রশ্বাসের হার

প্রতি মিনিটে শ্বাস

প্রতি ১ মিনিটে

২৩:১৪ - ২৩:১৫ - প্রতি মিনিটে ৬০ বার শ্বাস

২৩:১৬ - ২৩:১৬ - প্রতি মিনিটে ৬২ বার শ্বাস

২৩:১৭ - ২৩:১৮ - প্রতি মিনিটে ৬৪ বার শ্বাস

অক্সিজেন স্যাচুরেশন

%

প্রতি ১ ঘন্টা পর পর

৬:১১ - ৯৫.২০৮%

ওয়ার্কআউট বা ঘুমের সেশন শেষে হেলথ কানেক্ট-এ ডেটা লেখা উচিত। সক্রিয় ট্র্যাকিং, যেমন ব্যায়াম এবং ঘুম, অথবা পুষ্টির মতো ম্যানুয়াল ব্যবহারকারী ইনপুটের ক্ষেত্রে, এই রেকর্ডগুলি তৈরি হয় যখন অ্যাপটি ফোরগ্রাউন্ডে থাকে, অথবা এমন বিরল ক্ষেত্রে যখন এটি দিনে কয়েকবার ব্যবহার করা হয়।

নিশ্চিত করুন যে আপনার অ্যাপটি ইভেন্টের সম্পূর্ণ সময়কাল জুড়ে হেলথ কানেক্ট চালু রাখছে না।

দুটি উপায়ের যেকোনো একটিতে হেলথ কানেক্ট-এ ডেটা লিখতে হবে:

  • ইভেন্টটি সম্পন্ন হওয়ার পর হেলথ কানেক্ট-এ ডেটা সিঙ্ক করুন। উদাহরণস্বরূপ, ব্যবহারকারী যখন একটি ট্র্যাক করা ব্যায়াম সেশন শেষ করেন, তখন ডেটা সিঙ্ক করুন।
  • পরবর্তীতে ডেটা সিঙ্ক করার জন্য WorkManager ব্যবহার করে একটি এককালীন টাস্ক শিডিউল করুন।

ব্যায়াম এবং ঘুমের সেশন

ন্যূনতমপক্ষে, আপনার অ্যাপ্লিকেশনটি টেবিল ২-এর 'প্রত্যাশিত ' কলামের নির্দেশনা অনুসরণ করবে। যেখানে সম্ভব, 'সর্বোত্তম ' কলামের নির্দেশনা অনুসরণ করুন।

নিচের সারণিতে দেখানো হয়েছে, অনুশীলনের সময় কীভাবে ডেটা লিখতে হয়:

সারণি ২: ব্যায়াম চলাকালীন তথ্য লেখার নির্দেশিকা

ডেটা টাইপ

ইউনিট

প্রত্যাশিত

সেরা

উদাহরণ

পদক্ষেপ

পদক্ষেপ

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৫টি ধাপ

২৩:১৬ - ২৩:১৭ - ২২ ধাপ

২৩:১৭ - ২৩:১৮ - ৮টি ধাপ

স্টেপস ক্যাডেন্স

পদক্ষেপ/মিনিট

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৩৫ এসপিএম

২৩:১৬ - ২৩:১৭ - ৩৭ এসপিএম

২৩:১৭ - ২৩:১৮ - ৪০ এসপিএম

হুইলচেয়ার ধাক্কা দেয়

ধাক্কা

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৫টি ধাক্কা

২৩:১৬ - ২৩:১৭ - ২২ টি ধাক্কা

২৩:১৭ - ২৩:১৮ - ৮টি ধাক্কা

সাইক্লিং পেডালিং ক্যাডেন্স

আরপিএম

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৬৫ আরপিএম

২৩:১৬ - ২৩:১৭ - ৭০ আরপিএম

২৩:১৭ - ২৩:১৮ - ৬৮ আরপিএম

শক্তি

ওয়াট

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ২৫০ ওয়াট

২৩:১৬ - ২৩:১৭ - ২৫৫ ওয়াট

২৩:১৭ - ২৩:১৮ - ২৪৫ ওয়াট

গতি

কিমি/মিনিট

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ০.৩ কিমি/মিনিট

২৩:১৬ - ২৩:১৭ - ০.৪ কিমি/মিনিট

২৩:১৭ - ২৩:১৮ -০.৪ কিমি/মিনিট

দূরত্ব

কিমি/মি

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ০.০০৮ কিমি

২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি

২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি

সক্রিয় ক্যালোরি পোড়ানো

ক্যালোরি

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ২০ ক্যালোরি

২৩:১৬ - ২৩:১৭ - ২০ ক্যালোরি

২৩:১৭ - ২৩:১৮ - ২৫ ক্যালোরি

মোট ক্যালোরি খরচ

ক্যালোরি

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৩৬ ক্যালোরি

২৩:১৬ - ২৩:১৭ - ৩৬ ক্যালোরি

২৩:১৭ - ২৩:১৮ - ৪১ ক্যালোরি

উচ্চতা বৃদ্ধি

এম

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২০:৩৬ - ২০:৩৭ - ৩.০৪৮ মিটার

২০:৩৯ - ২০:৪০ - ৩.০৪৮ মিটার

২৩:২৩ - ২৩:২৪ - ৯.১৪৪ মিটার

ব্যায়ামের পথ

অক্ষাংশ/দ্রাঘিমাংশ/উচ্চতা

প্রতি ৩-৫ সেকেন্ডে

প্রতি ১ সেকেন্ডে

হৃদস্পন্দন

বিপিএম

মিনিটে ৪ বার

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ১৫০ বিপিএম

সারণি ৩-এ দেখানো হয়েছে, ঘুমের সময় বা পরে কীভাবে ডেটা লিখতে হয়:

সারণি ৩: ঘুমের সময় বা পরে তথ্য লেখার নির্দেশিকা

ডেটা টাইপ

ইউনিট

প্রত্যাশিত নমুনা

উদাহরণ

ঘুমের পর্যায় নির্ধারণ

মঞ্চ

ঘুমের প্রতিটি পর্যায়ের জন্য নির্দিষ্ট সময়কাল

২৩:৪৬ - ২৩:৫০ - জেগে থাকা

২৩:৫০ - ২৩:৫৬ - হালকা ঘুম

২৩:৫৬ - ০০:১৬ - গভীর ঘুম

বিশ্রামকালীন হৃদস্পন্দন

বিপিএম

একক দৈনিক মান (সকালে ঘুম থেকে ওঠার পরেই প্রত্যাশিত)

সকাল ৬:১১ - ৬০ বিপিএম

অক্সিজেন স্যাচুরেশন

%

একক দৈনিক মান (সকালে ঘুম থেকে ওঠার পরেই প্রত্যাশিত)

৬:১১ - ৯৫.২০৮%

বহু-ক্রীড়া ইভেন্ট

এই পদ্ধতিটি বিদ্যমান ডেটা টাইপ ও স্ট্রাকচার ব্যবহার করে এবং এটি বর্তমান হেলথ কানেক্ট ইমপ্লিমেন্টেশন ও ডেটা রিডারগুলোর সাথে সামঞ্জস্যতা যাচাই করে। ফিটনেস প্ল্যাটফর্মগুলো সাধারণত এই পদ্ধতি অনুসরণ করে থাকে।

এছাড়াও, হেলথ কানেক্ট-এর মধ্যে সাঁতার, সাইক্লিং এবং দৌড়ের মতো স্বতন্ত্র সেশনগুলো সহজাতভাবে সংযুক্ত নয়, এবং ডেটা পাঠকদেরকে এদের সময়ের নৈকট্যের উপর ভিত্তি করে সেশনগুলোর মধ্যকার সম্পর্ক অনুমান করে নিতে হয়। বিভিন্ন অংশের মধ্যে পরিবর্তন, যেমন সাঁতার থেকে সাইক্লিং-এ যাওয়া, স্পষ্টভাবে দেখানো হয় না।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি ট্রায়াথলনের জন্য ডেটা লিখতে হয়:

val swimStartTime = Instant.parse("2024-08-22T08:00:00Z")
val swimEndTime = Instant.parse("2024-08-22T08:30:00Z")
val bikeStartTime = Instant.parse("2024-08-22T08:40:00Z")
val bikeEndTime = Instant.parse("2024-08-22T09:40:00Z")
val runStartTime = Instant.parse("2024-08-22T09:50:00Z")
val runEndTime = Instant.parse("2024-08-22T10:20:00Z")

val swimSession = ExerciseSessionRecord(
    startTime = swimStartTime,
    endTime = swimEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_OPEN_WATER,
    metadata = Metadata(
        device = Device(type = Device.TYPE_WATCH)
    ),
    startZoneOffset = null,
    endZoneOffset = null,
)

val bikeSession = ExerciseSessionRecord(
    startTime = bikeStartTime,
    endTime = bikeEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING,
    metadata = Metadata(
        device = Device(type = Device.TYPE_WATCH)
    ),
    startZoneOffset = null,
    endZoneOffset = null,
)

val runSession = ExerciseSessionRecord(
    startTime = runStartTime,
    endTime = runEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    metadata = Metadata(
        device = Device(type = Device.TYPE_WATCH)
    ),
    startZoneOffset = null,
    endZoneOffset = null,
)

healthConnectClient.insertRecords(listOf(swimSession, bikeSession, runSession))

ব্যতিক্রমগুলি পরিচালনা করুন

কোনো সমস্যা দেখা দিলে হেলথ কানেক্ট CRUD অপারেশনের জন্য সাধারণ এক্সেপশন থ্রো করে। আপনার অ্যাপের উচিত এই প্রতিটি এক্সেপশন যথাযথভাবে ক্যাচ ও হ্যান্ডেল করা।

HealthConnectClient এর প্রতিটি মেথড সম্ভাব্য এক্সেপশনগুলোর একটি তালিকা প্রদান করে। সাধারণভাবে, আপনার অ্যাপের নিম্নলিখিত এক্সেপশনগুলো হ্যান্ডেল করা উচিত:

সারণি ১: হেলথ কানেক্ট-এর ব্যতিক্রমসমূহ এবং প্রস্তাবিত সর্বোত্তম অনুশীলনসমূহ
ব্যতিক্রম বর্ণনা সুপারিশকৃত সর্বোত্তম অনুশীলন
IllegalStateException নিম্নলিখিত পরিস্থিতিগুলোর মধ্যে একটি ঘটেছে:

  • হেলথ কানেক্ট পরিষেবাটি উপলব্ধ নেই।
  • অনুরোধটি একটি বৈধ গঠন নয়। উদাহরণস্বরূপ, পিরিয়ডিক বাকেটগুলিতে একটি অ্যাগ্রিগেট অনুরোধ, যেখানে timeRangeFilter এর জন্য একটি Instant অবজেক্ট ব্যবহার করা হয়।

অনুরোধ করার আগে ইনপুটগুলোর সম্ভাব্য সমস্যাগুলো প্রথমে সমাধান করুন। অনুরোধে সরাসরি ব্যবহার না করে, ভেরিয়েবলে মান নির্ধারণ করুন অথবা সেগুলোকে একটি কাস্টম ফাংশনের প্যারামিটার হিসেবে ব্যবহার করুন, যাতে আপনি ত্রুটি ব্যবস্থাপনার কৌশলগুলো প্রয়োগ করতে পারেন।
IOException ডিস্ক থেকে ডেটা পড়া এবং লেখার সময় সমস্যা দেখা দেয়। এই সমস্যাটি এড়ানোর জন্য এখানে কিছু পরামর্শ দেওয়া হলো:

  • ব্যবহারকারীর দেওয়া যেকোনো ইনপুটের ব্যাকআপ নিন।
  • বাল্ক রাইট অপারেশন চলাকালীন উদ্ভূত যেকোনো সমস্যা সামলাতে সক্ষম হতে হবে। উদাহরণস্বরূপ, প্রক্রিয়াটি যাতে সমস্যাটি অতিক্রম করে অবশিষ্ট অপারেশনগুলো সম্পন্ন করতে পারে, তা নিশ্চিত করতে হবে।
  • অনুরোধ সংক্রান্ত সমস্যা সমাধানে রিট্রাই এবং ব্যাকঅফ কৌশল প্রয়োগ করুন।

RemoteException এসডিকে যে অন্তর্নিহিত পরিষেবার সাথে সংযুক্ত হয়, তার অভ্যন্তরে অথবা তার সাথে যোগাযোগ করার ক্ষেত্রে ত্রুটি ঘটেছে।

উদাহরণস্বরূপ, আপনার অ্যাপ একটি নির্দিষ্ট uid সহ একটি রেকর্ড মুছে ফেলার চেষ্টা করছে। কিন্তু, অ্যাপটি যখন অন্তর্নিহিত পরিষেবাতে পরীক্ষা করে জানতে পারে যে রেকর্ডটির অস্তিত্ব নেই, তখন একটি ব্যতিক্রম (exception) দেখা দেয়।
এই সমস্যাটি এড়ানোর জন্য এখানে কিছু পরামর্শ দেওয়া হলো:

  • আপনার অ্যাপের ডেটাস্টোর এবং হেলথ কানেক্ট-এর মধ্যে নিয়মিত সিঙ্ক করুন।
  • অনুরোধ সংক্রান্ত সমস্যা সমাধানে রিট্রাই এবং ব্যাকঅফ কৌশল প্রয়োগ করুন।

SecurityException যখন অনুরোধগুলোর জন্য এমন অনুমতির প্রয়োজন হয় যা দেওয়া নেই, তখন সমস্যা দেখা দেয়। এটি এড়ানোর জন্য, নিশ্চিত করুন যে আপনি আপনার প্রকাশিত অ্যাপের জন্য হেলথ কানেক্ট ডেটা টাইপ ব্যবহারের ঘোষণা দিয়েছেন । এছাড়াও, আপনাকে অবশ্যই ম্যানিফেস্ট ফাইলে এবং আপনার অ্যাক্টিভিটিতে হেলথ কানেক্ট পারমিশন ঘোষণা করতে হবে।