【问题标题】:Why can't I use Resources.getSystem() without a Runtime error?为什么我不能在没有运行时错误的情况下使用 Resources.getSystem()?
【发布时间】:2012-01-14 17:36:01
【问题描述】:
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:字符串资源 ID #0x7f040003

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

【问题讨论】:

  • 这并不能真正回答您的问题,但字符串资源通常用于用户可显示的字符串(因此,如果您愿意,以后可以提供不同的语言)。在这种情况下,定义一个常量字符串来定义您的 create 语句就可以了。

标签: java android eclipse sqliteopenhelper


【解决方案1】:

根据 Android 文档,Resources.getSystem() 仅提供系统级资源,不提供应用级资源(如您的 strings.xml 文件中的资源)。

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

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

【讨论】:

  • 谢谢,布兰登。我不知道 Resources.getSystem() 不会返回我的应用程序资源,尽管现在看起来有点明显(事后诸葛亮等)。我也会考虑改用常量字符串。
  • +1。这是一个非常令人不快且难以发现的错误。当然,有用的信息。
【解决方案2】:

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

context.getResources().getString(myID);

除了布兰登的评论是正确的。

【讨论】:

  • 因此,除非我选择在我的 Java 代码中使用常量字符串,否则我必须使用上下文来访问 strings.xml。谢谢你的回答。
  • 它是 getResources,末尾有一个 s,如下所示:context.getResources().getString(R.string.yourStringID)
【解决方案3】:

您可以通过参数、静态变量或getApplicationContext()函数获取函数中的上下文参数。

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2022-07-08
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多