2012-01-14 14 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)); 
}} 

ottengo questo errorePerché non posso utilizzare Resources.getSystem() senza un errore di runtime?

01-14 12: 20: 57,591: E/AndroidRuntime (1825): a causa di: android.content.res.Resources $ NotFoundException: String ID di risorsa # 0x7f040003

il codice che causa l'errore è la linea singola all'interno createProfileTable specificamente, Resources.getSystem(). getString (R.string.create_profile_table_sql) se uso una variabile di classe per contenere un contesto e fare context.getString (R.string.create_profile_table_sql) Non capisco eventuali errori ma non voglio farlo perché voglio evitare perdite di memoria e in base a ciò che so dovrebbe funzionare. Qualche idea su cosa sta succedendo?

+1

Questo in realtà non risponde alla tua domanda, ma le risorse String sono generalmente per le stringhe visualizzabili dall'utente (in modo che tu possa fornire lingue diverse in seguito, se lo desideri). In questa situazione, definire una stringa costante che definisce la tua dichiarazione di creazione andrebbe bene. – Brandon

risposta

16

Secondo la documentazione di Android, Resources.getSystem() fornisce solo risorse a livello di sistema, non a livello di applicazione (come le risorse all'interno del file strings.xml).

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

Prova utilizzando contesto dell'applicazione se si vuole veramente per recuperare le corde in questo modo, o prendere il mio suggerimento nel commento alla tua domanda.

+0

Grazie, Brandon. Non ero a conoscenza del fatto che Resources.getSystem() non restituisse le mie risorse applicative, anche se ora sembra un po 'ovvio (a ben vedere e così via). Prenderò in considerazione anche l'utilizzo di una stringa costante. – Garzahd

+0

+1. È un errore molto spiacevole e difficile da trovare. Sicuramente, messaggio utile. – Gangnus

3

Utilizzando Resources.getSystem(). GetWhatEver() è possibile accedere solo alle risorse del sistema (si ottiene l'errore perché non c'è una risorsa a livello di sistema con il proprio ID). Poiché l'ID risorsa non è univoco tra le applicazioni, è necessario fornire l'applicazione quando si accede a una risorsa. In Android questo viene fatto usando Context. Quindi, se si desidera accedere a una risorsa è necessario usare in questo modo

context.getResource().getString(myID); 

A parte questo il commento di Brandon è corretta.

+0

Quindi, devo usare un contesto per accedere a strings.xml a meno che non scelga di usare una stringa costante nel mio codice Java. La ringrazio per la risposta. – Garzahd

0

È possibile ottenere il parametro di contesto nella funzione per parametro o tramite una variabile statica o tramite la funzione getApplicationContext().

Problemi correlati