Skip to content

การอัปเดตฐานข้อมูลในพื้นหลัง

ตั้งแต่ sorisdk 4.2.2 เป็นต้นมา คุณสามารถอัปเดตฐานข้อมูลการรู้จำเสียงในพื้นหลังได้ด้วย method updateDatabase ใหม่ ฟีเจอร์นี้ช่วยให้สื่อ (Material) สำหรับการรู้จำเสียงเป็นปัจจุบันอยู่เสมอโดยไม่รบกวนกระบวนการรู้จำ

ภาพรวม

method SORIAudioRecognizer.shared().updateDatabase(context) ช่วยให้คุณอัปเดตฐานข้อมูลการรู้จำเสียงจากเซิร์ฟเวอร์ได้ทุกเมื่อ ไม่ว่าการรู้จำเสียงกำลังทำงานอยู่หรือไม่ ฟีเจอร์นี้มีประโยชน์อย่างยิ่งสำหรับอุปกรณ์ที่ใช้การรู้จำเสียงอย่างต่อเนื่องเป็นเวลานาน

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

อัปเดตฐานข้อมูลด้วยตนเอง

คุณสามารถอัปเดตฐานข้อมูลด้วยตนเองได้ทุกเมื่อโดยเรียก method updateDatabase:

kotlin
val updateResult = SORIAudioRecognizer.shared().updateDatabase(this)

if (updateResult.success) {
    if (updateResult.updateAvailable) {
        Log.i("SORI", "Database updated successfully to version: ${updateResult.currentVersion}")
    } else {
        Log.d("SORI", "Database is already up to date (version: ${updateResult.currentVersion})")
    }
} else {
    Log.e("SORI", "Database update failed: ${updateResult.errorMessage}")
}
java
SORIUpdateResult updateResult = SORIAudioRecognizer.shared().updateDatabase(this);

if (updateResult.getSuccess()) {
    if (updateResult.getUpdateAvailable()) {
        Log.i("SORI", "Database updated successfully to version: " + updateResult.getCurrentVersion());
    } else {
        Log.d("SORI", "Database is already up to date (version: " + updateResult.getCurrentVersion() + ")");
    }
} else {
    Log.e("SORI", "Database update failed: " + updateResult.getErrorMessage());
}

อัปเดตในพื้นหลังเป็นระยะด้วย WorkManager

สำหรับการอัปเดตเป็นระยะโดยอัตโนมัติ คุณสามารถใช้ WorkManager ของ Android เพื่อกำหนดเวลาการอัปเดตฐานข้อมูลในพื้นหลัง วิธีนี้ช่วยให้ฐานข้อมูลการรู้จำเสียงเป็นปัจจุบันโดยไม่ต้องดำเนินการด้วยตนเอง

ตั้งค่าการอัปเดตเป็นระยะ

เพิ่มโค้ดต่อไปนี้ลงในไฟล์ MainActivity.kt หรือ MainActivity.java เพื่อตั้งค่าการอัปเดตฐานข้อมูลเป็นระยะ:

kotlin
private fun setupPeriodicDatabaseUpdate() {
    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build()

    val workRequest = PeriodicWorkRequestBuilder<UpdateDatabaseWorker>(2, TimeUnit.HOURS)
        .setConstraints(constraints)
        .build()

    WorkManager.getInstance(this).enqueueUniquePeriodicWork(
        "UpdateSORIDatabase",
        ExistingPeriodicWorkPolicy.KEEP,
        workRequest
    )

    Log.d("SORI", "Periodic database update scheduled every 2 hours")
}
java
private void setupPeriodicDatabaseUpdate() {
    Constraints constraints = new Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build();

    PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(
            UpdateDatabaseWorker.class, 2, TimeUnit.HOURS)
        .setConstraints(constraints)
        .build();

    WorkManager.getInstance(this).enqueueUniquePeriodicWork(
        "UpdateSORIDatabase",
        ExistingPeriodicWorkPolicy.KEEP,
        workRequest
    );

    Log.d("SORI", "Periodic database update scheduled every 2 hours");
}

การเพิ่มประสิทธิภาพแบตเตอรี่

การตั้งค่า worker ให้ทำงานถี่เกินไปอาจส่งผลเสียต่อ Android vitals เช่น การใช้แบตเตอรี่ เราแนะนำให้กำหนดช่วงเวลาอย่างน้อย 2 ชั่วโมงเพื่อรักษาประสิทธิภาพสูงสุดของอุปกรณ์

สร้างคลาส Worker

สร้างไฟล์ใหม่ UpdateDatabaseWorker.kt หรือ UpdateDatabaseWorker.java ในโปรเจกต์ด้วยการนำไปใช้ต่อไปนี้:

kotlin
package com.iplateia.soriexample

import android.content.Context
import android.util.Log
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.iplateia.sorisdk.SORIAudioRecognizer

/**
 * Worker class that periodically updates the SORI audio recognition database.
 * This worker runs every 2 hours to check for and download new audiopack updates.
 */
class UpdateDatabaseWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    companion object {
        private const val TAG = "UpdateDatabaseWorker"
    }

    override suspend fun doWork(): Result {
        return try {
            Log.d(TAG, "Starting periodic database update check")
            
            // Get the SORI recognizer instance
            val recognizer = SORIAudioRecognizer.shared()
            
            // Perform the database update
            val updateResult = recognizer.updateDatabase(applicationContext)
            
            if (updateResult.success) {
                if (updateResult.updateAvailable) {
                    Log.i(TAG, "Database updated successfully to version: ${updateResult.currentVersion}")
                } else {
                    Log.d(TAG, "Database is already up to date (version: ${updateResult.currentVersion})")
                }
                Result.success()
            } else {
                Log.e(TAG, "Database update failed: ${updateResult.errorMessage}")
                // Return retry for temporary failures, success for permanent failures
                if (updateResult.errorMessage?.contains("Authentication failed") == true) {
                    Result.failure() // Don't retry authentication failures
                } else {
                    Result.retry() // Retry for network issues, etc.
                }
            }
        } catch (e: Exception) {
            Log.e(TAG, "Unexpected error during database update", e)
            Result.retry()
        }
    }
}
java
package com.iplateia.soriexample;

import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import com.iplateia.sorisdk.SORIAudioRecognizer;
import com.iplateia.sorisdk.SORIUpdateResult;

/**
 * Worker class that periodically updates the SORI audio recognition database.
 * This worker runs every 2 hours to check for and download new audiopack updates.
 */
public class UpdateDatabaseWorker extends Worker {
    private static final String TAG = "UpdateDatabaseWorker";

    public UpdateDatabaseWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        try {
            Log.d(TAG, "Starting periodic database update check");
            
            // Get the SORI recognizer instance
            SORIAudioRecognizer recognizer = SORIAudioRecognizer.shared();
            
            // Perform the database update
            SORIUpdateResult updateResult = recognizer.updateDatabase(getApplicationContext());
            
            if (updateResult.getSuccess()) {
                if (updateResult.getUpdateAvailable()) {
                    Log.i(TAG, "Database updated successfully to version: " + updateResult.getCurrentVersion());
                } else {
                    Log.d(TAG, "Database is already up to date (version: " + updateResult.getCurrentVersion() + ")");
                }
                return Result.success();
            } else {
                Log.e(TAG, "Database update failed: " + updateResult.getErrorMessage());
                // Return retry for temporary failures, success for permanent failures
                String errorMessage = updateResult.getErrorMessage();
                if (errorMessage != null && errorMessage.contains("Authentication failed")) {
                    return Result.failure(); // Don't retry authentication failures
                } else {
                    return Result.retry(); // Retry for network issues, etc.
                }
            }
        } catch (Exception e) {
            Log.e(TAG, "Unexpected error during database update", e);
            return Result.retry();
        }
    }
}

เพิ่ม WorkManager dependencies

ตรวจสอบว่าได้เพิ่ม WorkManager dependency ลงในไฟล์ build.gradle แล้ว:

groovy
dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.0" // For Kotlin
    // or
    implementation "androidx.work:work-runtime:2.9.0" // For Java
}
kotlin
dependencies {
    implementation("androidx.work:work-runtime-ktx:2.9.0") // For Kotlin
    // or
    implementation("androidx.work:work-runtime:2.9.0") // For Java
}

การเริ่มต้น

เรียก method setupPeriodicDatabaseUpdate() ใน method MainActivity.onCreate() หรือในโค้ดเริ่มต้นของแอปพลิเคชัน:

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    // ... your existing code ...
    
    // Set up periodic database updates
    setupPeriodicDatabaseUpdate()
}
java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    // ... your existing code ...
    
    // Set up periodic database updates
    setupPeriodicDatabaseUpdate();
}

แนวทางปฏิบัติที่ดี

  1. ข้อจำกัดของเครือข่าย: กำหนดข้อจำกัดของเครือข่ายเสมอ เพื่อให้อัปเดตเฉพาะเมื่อเชื่อมต่อและหลีกเลี่ยงการใช้ข้อมูลโดยไม่จำเป็น

  2. การจัดการข้อผิดพลาด: ใช้การจัดการข้อผิดพลาดที่เหมาะสมเพื่อแยกปัญหาเครือข่ายชั่วคราว (ลองใหม่) ออกจากความล้มเหลวถาวร (ไม่ต้องลองใหม่)

  3. การบันทึก log: เพิ่มการบันทึก log ที่เหมาะสมเพื่อติดตามกระบวนการอัปเดตและวินิจฉัยปัญหา

  4. ความถี่ในการอัปเดต: คำนึงถึงอายุแบตเตอรี่และการใช้ข้อมูลของผู้ใช้เมื่อกำหนดความถี่ในการอัปเดต เราแนะนำให้กำหนดช่วงเวลาอย่างน้อย 2 ชั่วโมง

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

การแก้ไขปัญหา

หากพบปัญหาเกี่ยวกับการอัปเดตในพื้นหลัง:

  1. ตรวจสอบการเชื่อมต่อเครือข่าย: ตรวจสอบว่าอุปกรณ์เชื่อมต่ออินเทอร์เน็ตอย่างเสถียร
  2. ตรวจสอบ API Credentials: ตรวจสอบว่ากำหนดค่า API key และ secret อย่างถูกต้อง
  3. ตรวจสอบ Logs: ตรวจสอบข้อความข้อผิดพลาดใน logs ที่อาจช่วยระบุปัญหา
  4. ข้อจำกัดของ WorkManager: ตรวจสอบว่าข้อจำกัด WorkManager เหมาะกับ use case ของคุณ

เอกสารอ้างอิง API

โปรดดูข้อมูลโดยละเอียดเกี่ยวกับ method updateDatabase และค่าที่คืนได้ที่ เอกสารอ้างอิง API