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

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) Я не получаю никаких ошибок, но я не хочу этого делать, потому что я хочу избежать утечек памяти и в соответствии с тем, что я знаю, это должно работать. Есть идеи, что происходит?


person Garzahd    schedule 14.01.2012    source источник
comment
На самом деле это не отвечает на ваш вопрос, но ресурсы String обычно предназначены для строк, отображаемых пользователем (так что вы можете предоставить другие языки позже, если хотите). В этой ситуации можно было бы определить постоянную строку, определяющую ваш оператор создания.   -  person Brandon    schedule 14.01.2012


Ответы (3)


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

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

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

person Brandon    schedule 14.01.2012
comment
Спасибо, Брэндон. Я не знал, что Resources.getSystem () не вернет ресурсы моего приложения, хотя сейчас это кажется немного очевидным (ретроспективный взгляд и тому подобное). Я также рассмотрю возможность использования вместо этого постоянной строки. - person Garzahd; 14.01.2012
comment
+1. Это очень неприятная ошибка, которую трудно найти. Безусловно, полезное сообщение. - person Gangnus; 15.01.2012

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

context.getResources().getString(myID);

В остальном комментарий Брэндона верен.

person Stefan    schedule 14.01.2012
comment
Итак, я должен использовать контекст для доступа к strings.xml, если вместо этого я не решу использовать постоянную строку в моем коде Java. Спасибо за ваш ответ. - person Garzahd; 14.01.2012
comment
Это getResources с буквой s в конце, вот так: context.getResources().getString(R.string.yourStringID) - person Moses Ndeda; 22.04.2019

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

person Gangnus    schedule 14.01.2012