¿Por qué no puedo usar Resources.getSystem () sin un error de tiempo de ejecución?

public class BobDatabase extends SQLiteOpenHelper{ private static final String DATABASE_NAME = "bob.db"; private static final int DATABASE_VERSION = 1; public static final String DEFAULT_PROFILE = "default_profile"; public BobDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase database) { createProfileTable(database); createTimeTable(database); createEventTable(database); createLocationTable(database); } /** * Creates a table for Profile objects, executes the string create_profile_table_sql * contained within strings.xml * @param database */ public void createProfileTable(SQLiteDatabase database) { database.execSQL(Resources.getSystem().getString(R.string.create_profile_table_sql)); }} 

Consigo este error

01-14 12: 20: 57.591: E / AndroidRuntime (1825): Causado por: android.content.res.Resources $ NotFoundException: String resource ID # 0x7f040003

El código que causa el error es la única línea dentro de createProfileTable específicamente, Resources.getSystem (). GetString (R.string.create_profile_table_sql) si uso una variable de clase para contener un Contexto y hacer context.getString (R.string.create_profile_table_sql) No tengo ningún error, pero no quiero hacerlo porque quiero evitar fugas de memoria y de acuerdo a lo que sé que esto debería funcionar. ¿Alguna idea de lo que está pasando?

Según la documentación de Android, Resources.getSystem() sólo proporciona recursos de nivel de sistema, no de nivel de aplicación (como los recursos dentro del archivo strings.xml).

http://developer.android.com/reference/android/content/res/Resources.html#getSystem ()

Trate de usar el contexto de la aplicación si realmente desea recuperar sus cadenas de esta manera, o tomar mi sugerencia en el comentario a su pregunta.

Usando Resources.getSystem (). GetWhatEver () sólo puede acceder a recursos de todo el sistema (se obtiene el error porque no hay recurso de todo el sistema con su ID). Dado que el ID de recursos no es único entre las aplicaciones, debe proporcionar la aplicación al acceder a un recurso. En Android esto se hace usando Contexto. Así que si quieres acceder a algún recurso tienes que usarlo así

 context.getResource().getString(myID); 

Aparte de que el comentario de Brandon es correcto.

Usted podría obtener el parámetro de contexto en la función por parámetro, o por una variable estática, o por la función getApplicationContext() .

  • SQLiteOpenHelper "onCreate" no se llama? (El DB no existe)
  • Conexión de SQLite se filtró aunque todo se cerró
  • Error al insertar android.database.sqlite.sqliteconstraintexception error código 19 restricción fallida
  • Android SqliteAssetHelper - fusionar las tablas de la base de datos del activo con el existente
  • Cómo insertar a granel en sqlite en android
  • Excepción fatal: error desconocido (código 14) no se pudo abrir la base de datos
  • Intenta reabrir un objeto ya cerrado: sqlitequery
  • Abra / cierre correctamente una base de datos con el patrón de diseño Singleton
  • Uso de una base de datos SQLite en Libgdx
  • Archivo DB en carpeta de activos. ¿Se actualizará?
  • Obtención de contexto en onCreate en SQLiteOpenHelper
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.