2012-01-14 15 views
7
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¿Por qué no puedo usar Resources.getSystem() sin un error de tiempo de ejecución?

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

el código que hace que el error es la única línea dentro createProfileTable específicamente, Resources.getSystem(). getString (R.string.create_profile_table_sql) si uso una variable de clase para mantener un contexto y hacer context.getString (R.string.create_profile_table_sql) No entiendo cualquier error pero no quiero hacer eso porque quiero evitar pérdidas de memoria y de acuerdo con lo que sé, esto debería funcionar. ¿Alguna idea de lo que está pasando?

+1

Esto realmente no responde a su pregunta, pero los recursos de String generalmente son para cadenas desplegables por el usuario (para que pueda proporcionar diferentes idiomas más adelante si lo desea). En esta situación, definir una cadena constante que defina tu declaración de creación estaría bien. – Brandon

Respuesta

16

De acuerdo con la documentación de Android, Resources.getSystem() solo proporciona recursos de nivel de sistema, no de nivel de aplicación (como los recursos dentro de su 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.

+0

Gracias, Brandon. No sabía que Resources.getSystem() no devolvería los recursos de mi aplicación, aunque parece obvio ahora (en retrospectiva y demás). También consideraré usar una cadena constante en su lugar. – Garzahd

+0

+1. Es un error muy desagradable y difícil de encontrar. Sin duda, mensaje útil. – Gangnus

3

Usando Resources.getSystem(). GetWhatEver() solo puede acceder a los recursos de todo el sistema (se obtiene el error porque no hay un recurso de todo el sistema con su ID). Dado que el ID de recurso no es exclusivo en todas las aplicaciones, debe proporcionar la aplicación cuando se accede a un recurso. En Android esto se hace usando Contexto. lo tanto, si desea acceder a algunos recursos que necesita para utilizar de esta manera

context.getResource().getString(myID); 

Aparte de que el comentario de Brandon es correcta.

+0

Por lo tanto, debo usar un contexto para acceder a strings.xml a menos que elija usar una cadena constante en mi código de Java. Gracias por su respuesta. – Garzahd

0

Puede 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().

Cuestiones relacionadas