【问题标题】:Check in android activity (at runtime) if strings.xml has changed from last execution如果 strings.xml 与上次执行相比发生了变化,则检查 android 活动(在运行时)
【发布时间】:2014-07-14 12:46:24
【问题描述】:

我的应用程序必须在 sqlite db 中处理本地化,因为用户可以在运行时从应用程序内部更改翻译,所以我不能只使用资源文件,因为它们不能在运行时修改

我使用资源文件来存储默认翻译,并且(目前)每次应用启动时这些翻译都会导入到数据库中。

我检索和数组包含 strings.xml 中的所有字符串 Field[] 字段 = R.string.class.getFields();

并循环这个数组插入新值并更新现有值。 不幸的是,每次所有字符串都循环不是更新我的数据库的有效方法,所以我想知道是否有一种方法可以仅在原始 strings.xml 中的某些内容发生更改而不强制执行导入时执行导入,例如,存储我的数据库中应用程序的版本号,并在启动时检查此数字是否已更改,然后执行更新

【问题讨论】:

  • 好吧 string.xml 只能在编译时更改,所以如果我没有误解你的话,检查你是否正在升级你的应用程序就足够了
  • @blackbelt 你的意思是检查应用程序的版本代码?我对此表示怀疑,但出于开发目的,我不会在每次修改 strings.xml 时都增加版本代码
  • 但是你也没有发布它

标签: java android xml sqlite localization


【解决方案1】:

位于 res/values 的 strings.xml 不能在运行时更改。只能在编译之前对其进行修改。

如果您确实想存储字符串,请查看SharedPreferences。例如,您可以存储当前翻译的状态,并检查是否有任何更改

【讨论】:

  • 我知道这一点,因此我使用 db 来存储我的翻译。但是每次应用程序启动时我都必须从 strings.xml 导入默认翻译,因为如果 strings.xml 中的默认翻译发生更改,我必须更新我的数据库。我只想以一种有效的方式来做,而不是每次应用启动时
【解决方案2】:

其他人提到strings.xml的内容不能在运行时更改,所以我将忽略它。

如果您想监控文件版本之间的更改以触发语言数据库的自动更新,最好的方法是在其中设置一个专门用于记录当前版本的条目。您可以在资源文件的顶部放置一个值,例如:

<string name="current_string_language_resources_version">3</string>

然后,当您将值加载到数据库中时,也存储该值。

一开始你应该比较这两个值,它们是不同的,然后导入存储的值并记住更新保存的版本号/字符串/随便什么。

根据各种语言选项是一起升级还是单独升级,您可以将值全部保存在 XML 中(共享)或每个单独的语言选项的 XML。只要确保记住在进行更改时增加版本号即可。

【讨论】:

  • 谢谢@invisible,但这是一个类似于将版本代码存储在数据库中的解决方案,每次我更改 strings.xml 时升级它,然后在启动时检查它是否已更改!我想知道我是否可以找到另一种方法。也许根本不可能
  • @on35,就像我在上一段中所说的那样,这取决于您是将所有刺痛存储在一个文件还是多个单独的文件中。如果您不想走版本号路线,那么您可能会获得 XML 文件的哈希值(如果您可以将资源文件作为File 访问,则实际上无法记住)或对内容进行其他计算但是您需要在某处存储某种状态值以了解是否已修改。除了读取和比较整个文件的内容之外,别无他法,这基本上与您当前所做的工作一样多。
  • @on35,Myabe,您需要重写您的问题,以更清楚地说明您想要和不想 做什么。还有想要这样做的原因。可能是您使具有更清洁/更简单解决方案的东西过于复杂。
  • 不幸的是,HASH 方式是不可能的,因为无法从应用程序内部计算文件的校验和,因为所有内容都已编译
  • 所以澄清一下 - 您想要一种方法来测试值是否已更改,而无需手动增加版本或类似计数器,也无需将保存的值与从 XML 读取的值进行比较?
猜你喜欢
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多