Skip to content

Actualización de la base de datos en segundo plano

Desde sorisdk 4.2.2 puede actualizar la base de datos de reconocimiento de audio en segundo plano mediante el nuevo método updateDatabase. Esta función permite mantener actualizado el material de reconocimiento de audio sin interrumpir el proceso de reconocimiento.

Descripción general

El método SORIAudioRecognizer.shared().updateDatabase(context) permite actualizar la base de datos de reconocimiento de audio desde el servidor en cualquier momento, independientemente de si el reconocimiento de audio se está ejecutando. Resulta especialmente útil en dispositivos que ejecutan el reconocimiento de audio de forma continua durante periodos prolongados.

Por ejemplo, si se añade nuevo material de audio al servidor mientras el reconocimiento está activo, puede llamar a este método para utilizarlo inmediatamente sin reiniciar el proceso de reconocimiento.

Actualización manual de la base de datos

Puede actualizar manualmente la base de datos en cualquier momento mediante una llamada al método 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());
}

Actualizaciones periódicas en segundo plano con WorkManager

Para realizar actualizaciones periódicas automáticas, puede utilizar WorkManager de Android para programar actualizaciones de la base de datos en segundo plano. Este enfoque mantiene actualizada la base de datos de reconocimiento de audio sin intervención manual.

Configurar las actualizaciones periódicas

Añada el siguiente código a su archivo MainActivity.kt o MainActivity.java para configurar actualizaciones periódicas de la base de datos:

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

Optimización de la batería

Configurar el worker para que se ejecute con demasiada frecuencia puede afectar negativamente a Android vitals, incluido el consumo de batería. Recomendamos utilizar intervalos de 2 horas o más para mantener un rendimiento óptimo del dispositivo.

Crear la clase Worker

Cree un nuevo archivo UpdateDatabaseWorker.kt o UpdateDatabaseWorker.java en su proyecto con la siguiente implementación:

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

Añadir las dependencias de WorkManager

Asegúrese de añadir la dependencia de WorkManager al archivo 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
}

Inicialización

Llame al método setupPeriodicDatabaseUpdate() desde el método MainActivity.onCreate() o desde el código de inicialización de su aplicación:

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

Prácticas recomendadas

  1. Restricciones de red: establezca siempre restricciones de red para garantizar que las actualizaciones solo se realicen cuando haya conexión y evitar un uso de datos innecesario.

  2. Gestión de errores: implemente una gestión de errores adecuada para distinguir entre problemas de red temporales (reintentar) y fallos permanentes (no reintentar).

  3. Registros: incluya registros adecuados para supervisar el proceso de actualización y diagnosticar cualquier problema.

  4. Frecuencia de actualización: tenga en cuenta la duración de la batería y el uso de datos de sus usuarios al establecer la frecuencia de actualización. Recomendamos intervalos de 2 horas o más.

  5. Experiencia de usuario: dado que las actualizaciones de la base de datos se realizan en segundo plano, considere informar a los usuarios de cuándo se actualizó por última vez si resulta pertinente para la experiencia de usuario de su aplicación.

Solución de problemas

Si tiene problemas con las actualizaciones en segundo plano:

  1. Compruebe la conexión de red: asegúrese de que el dispositivo dispone de una conexión a Internet estable.
  2. Verifique las credenciales de la API: asegúrese de que la clave y el secreto de la API están configurados correctamente.
  3. Revise los registros: compruebe si contienen mensajes de error concretos que puedan ayudarle a identificar el problema.
  4. Restricciones de WorkManager: verifique que las restricciones de WorkManager sean adecuadas para su caso de uso.

Referencia de la API

Para obtener información detallada sobre el método updateDatabase y sus valores de retorno, consulte la Referencia de la API.