Почему я не могу использовать Resource.getSystem() без ошибки Runtime?

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

Я получаю эту ошибку

01-14 12: 20: 57.591: E/AndroidRuntime (1825): вызвано: android.content.res.Resources $NotFoundException: Идентификатор ресурса строки # 0x7f040003

Кодом, вызывающим ошибку, является единственная строка внутри createProfileTable, Resources.getSystem(). getString (R.string.create_profile_table_sql), если я использую переменную класса для хранения Контекста и выполняю context.getString(R.string.create_profile_table_sql) Я не получаю никаких ошибок, но я не хочу этого делать, потому что я хочу избежать утечек памяти и, согласно тому, что знаю, должен работать. Любая идея, что происходит?

Ответ 1

Согласно документации Android, Resources.getSystem() предоставляет только ресурсы на системном уровне, а не на уровне приложений (например, ресурсы внутри файла strings.xml).

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

Попробуйте использовать контекст приложения, если вы действительно хотите получить ваши строки таким образом, или примите мое предложение в комментарии к вашему вопросу.

Ответ 2

Использование Resource.getSystem(). getWhatEver() позволяет получить доступ только к общесистемным ресурсам (вы получаете сообщение об ошибке, поскольку для вашего идентификатора нет системного ресурса). Поскольку идентификатор ресурса не уникален для всех приложений, вам необходимо предоставить приложение при доступе к ресурсу. В Android это делается с использованием контекста. Поэтому, если вы хотите получить доступ к некоторому ресурсу, вам нужно использовать его так:

context.getResource().getString(myID);

Кроме того, комментарий Брэндона правильный.

Ответ 3

Вы можете получить параметр param параметра в функции по параметру или статической переменной или с помощью функции getApplicationContext().