【问题标题】:Best way to store Resource id in Database on Android在 Android 上的数据库中存储资源 ID 的最佳方式
【发布时间】:2014-01-28 09:57:24
【问题描述】:

在我的应用程序中,我希望能够在数据库中存储一些图标的资源 ID。我想这不是保存,因为在后期(应用程序升级)我可能想向应用程序添加新图标,所以所有 id 都可能改变?如果我不想将图标存储为 blob,那么存储资源的最佳做法是什么?

例如,假设我有一个游戏 1.0,我让用户从头像列表中为他的角色选择一个头像。我想将此头像 id 存储在数据库中,并确保如果我在游戏 1.1 中添加更多头像 - 用户仍然会看到他的选择。

【问题讨论】:

  • 你需要更清楚。图标保存在 drawables 文件夹中。为什么还要在数据库中引用它们?
  • 啊,好的。我想保存用户从我提供的列表中选择的图标,因此在以后的应用程序启动中显示选择的图标。
  • 你说的是应用图标吗?因为您无法在应用签名后修改清单。
  • 不,不是应用程序图标,只是可绘制文件夹中的一些图标。这不是关于图标,而是关于资源 ID。我想将用户选择的 R.id 存储在数据库中,而不用担心应用程序升级。我担心的是 R.id 在编译期间生成,我担心在应用更新期间添加更多相同类型的资源后它可能会发生变化。

标签: android database android-resources


【解决方案1】:

(在我看来)最好的方法是存储资源条目名称。

String iconName = getResources().getResourceEntryName(R.drawable.your_icon);

因此,您要在其中存储图标的 SQLite 数据库列的类型为 TEXT。你说得对,存储资源 ID 是一种不好的做法,因为它们是在你编译应用程序时重新创建的,所以你不能指望它们不会改变(我很难学会这一点,我所有应用程序的图标都搞砸了)。

要在需要时从字符串中获取资源 ID,请调用

int resID = getResources().getIdentifier(iconName, "drawable", getPackageName());

请注意,getResources()getPackageName() 都是来自 Context 的方法,因此您需要引用您的应用程序/活动上下文才能调用这些方法。

【讨论】:

  • 由于这种方法有效,我也在使用它,它在性能方面是一个巨大的缺点。现在我正在寻找其他方式(也许一旦检索到可绘制的 id)
  • @rimes 这将不起作用,因为当您将新库添加到代码中并且所有 id 都可以更改时,id 可能会更改
  • @FindOutIslamNow 使用这种方法,我不关心 id-s。我将资源名称存储在我的数据库中,然后在启动应用程序时,将名称解析为 id-s(因此每次启动应用程序时,我都会获得最新的 id-s)。启动应用程序时会有一点延迟,但由于我显示的是“启动画面”,所以这不是问题。一旦 id 被解析,我也会缓存它,这使得其他所有调用都更快
  • @rimes 好。我认为缓存是一个好主意,但前提是您确定会首先显示 spalsh 屏幕(例如,用户可能从活动历史记录中打开应用程序)。然后,您将使其延迟初始化(在第一次使用它们而不是启动屏幕时)
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多