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

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

01-14 12: 20: 57,591: E/AndroidRuntime (1825): Вызванный: android.content.res.Resources $ NotFoundException: String ресурс ID # 0x7f040003

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

+1

Это на самом деле не отвечает на ваш вопрос, но ресурсы String, как правило, предназначены для отображаемых пользователем строк (поэтому вы можете предоставить разные языки позже, если хотите). В этой ситуации определение константной строки, определяющей ваш оператор create, будет в порядке. – Brandon

ответ

16

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

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

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

+0

Спасибо, Брэндон. Я не знал, что Resource.getSystem() не вернет мои ресурсы приложений, хотя теперь это кажется немного очевидным (задним числом и т. Д.). Я также рассмотрю возможность использования постоянной строки. – Garzahd

+0

+1. Это очень неприятная и труднодоступная ошибка. Конечно, полезное сообщение. – Gangnus

3

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

context.getResource().getString(myID); 

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

+0

Итак, я должен использовать контекст для доступа к strings.xml, если вместо этого я не буду использовать константную строку в своем Java-коде. Спасибо за ваш ответ. – Garzahd

0

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