Skip to content

バックグラウンドデータベース更新

sorisdk 4.2.1以降、新しいupdateDatabaseメソッドを使用してバックグラウンドでオーディオ認識データベースを更新できます。この機能により、認識プロセスを中断することなく、オーディオ認識マテリアルを最新の状態に保つことができます。

概要

SORIAudioRecognizer.shared().updateDatabase(context)メソッドを使用すると、オーディオ認識が現在実行中かどうかに関係なく、いつでもサーバーからオーディオ認識データベースを更新できます。これは、長時間継続的にオーディオ認識を実行するデバイスで特に有用です。

例えば、オーディオ認識がアクティブな状態でサーバーに新しいオーディオマテリアルが追加された場合、このメソッドを呼び出すことで、認識プロセスを再開することなく、新しいオーディオマテリアルを即座に使用できます。

手動データベース更新

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

WorkManagerを使用した定期的なバックグラウンド更新

自動的な定期更新には、AndroidのWorkManagerを使用してバックグラウンドデータベース更新をスケジュールできます。この方法により、手動介入なしでオーディオ認識データベースを最新の状態に保つことができます。

定期更新の設定

MainActivity.ktファイルに次のコードを追加して、定期的なデータベース更新を設定します:

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

バッテリー最適化

ワーカーが頻繁に実行されるよう設定すると、バッテリー消費などのAndroidバイタルに悪影響を与える可能性があります。最適なデバイスパフォーマンスを維持するため、2時間以上の間隔を使用することを推奨します。

ワーカークラスの作成

プロジェクトに次の実装を含む新しいUpdateDatabaseWorker.ktファイルを作成します:

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

/**
 * SORIオーディオ認識データベースを定期的に更新するワーカークラスです。
 * このワーカーは2時間ごとに実行され、新しいオーディオパック更新の確認とダウンロードを行います。
 */
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")
            
            // SORI認識機のインスタンスを取得
            val recognizer = SORIAudioRecognizer.shared()
            
            // データベース更新を実行
            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}")
                // 一時的な失敗には再試行、永続的な失敗には成功を返す
                if (updateResult.errorMessage?.contains("Authentication failed") == true) {
                    Result.failure() // 認証失敗は再試行しない
                } else {
                    Result.retry() // ネットワーク問題などは再試行
                }
            }
        } catch (e: Exception) {
            Log.e(TAG, "Unexpected error during database update", e)
            Result.retry()
        }
    }
}

WorkManager依存関係の追加

build.gradleファイルにWorkManager依存関係を追加してください:

groovy
dependencies {
    implementation "androidx.work:work-runtime-ktx:2.9.0"
}

初期化

MainActivity.onCreate()メソッドまたはアプリケーションの初期化コードでsetupPeriodicDatabaseUpdate()メソッドを呼び出します:

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    // ... 既存のコード ...
    
    // 定期的なデータベース更新を設定
    setupPeriodicDatabaseUpdate()
}

ベストプラクティス

  1. ネットワーク制約: 不要なデータ使用を避けるため、接続時のみ更新が発生するよう常にネットワーク制約を設定します。

  2. エラー処理: 一時的なネットワーク問題(再試行)と永続的な失敗(再試行しない)を区別する適切なエラー処理を実装します。

  3. ログ記録: 更新プロセスを監視し、問題を診断するために適切なログ記録を含めます。

  4. 更新頻度: 更新頻度を設定する際は、ユーザーのバッテリー寿命とデータ使用量を考慮します。2時間以上の間隔を推奨します。

  5. ユーザーエクスペリエンス: データベース更新はバックグラウンドで発生するため、アプリのUXに関連する場合は、データベースが最後に更新された時間に関する情報をユーザーに提供することを検討します。

トラブルシューティング

バックグラウンド更新で問題が発生した場合:

  1. ネットワーク接続の確認: デバイスが安定したインターネット接続を持っていることを確認します。
  2. API認証情報の確認: APIキーとシークレットが正しく設定されていることを確認します。
  3. ログの確認: 問題を特定するのに役立つ具体的なエラーメッセージをログで確認します。
  4. WorkManager制約: WorkManager制約がユースケースに適切であることを確認します。

APIリファレンス

updateDatabaseメソッドとその戻り値の詳細については、APIリファレンスを参照してください。