为什么我不能在没有运行时错误的情况下使用 Resources.getSystem()?

2022-09-04 05:42:44
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): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x7f040003

导致错误的代码是createProfileTable中的单行,特别是Resources.getSystem().getString(R.string.create_profile_table_sql)如果我使用类变量来保存上下文并执行 context.getString(R.string.create_profile_table_sql)我没有得到任何错误,但我不想这样做,因为我想避免内存泄漏,并且根据我知道这应该起作用。知道发生了什么吗?


答案 1

根据 Android 文档,仅提供系统级资源,而不提供应用程序级资源(如字符串中的资源.xml文件)。Resources.getSystem()

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

如果您真的想以这种方式检索字符串,请尝试使用应用程序的上下文,或者将我在评论中的建议用于您的问题。


答案 2

使用 Resources.getSystem().getWhatEver() 您只能访问系统范围的资源(您会收到错误,因为没有具有您的 ID 的系统范围的资源)。由于资源 ID 在应用程序之间不是唯一的,因此在访问资源时需要提供应用程序。在Android中,这是使用上下文完成的。因此,如果您想访问某些资源,则需要像这样使用它

context.getResources().getString(myID);

除此之外,布兰登的评论是正确的。


推荐