我注意到,在getIdentifier的android开发者页面上,它写道:
注意:不建议使用此函数。按标识符检索资源比按名称检索资源效率高得多。
我想尽量避免使用它,但我目前的实现取决于它。
在我的数据库中,我有数百个预先填充的条目,每个条目都有3个关联的字符串资源和一个图像。为了通过条目访问资源,我将资源名称保存为元组中的字符串,然后使用getIdentifier加载它们。
如果我的实现令人困惑,这里有一些图片和示例代码:
string resources file
database table
示例代码:
coin = model.getSelectedCoin()!!
binding.topMedia.setImageResource(
resources.getIdentifier(coin.imageAddress, "drawable", requireContext().packageName)
)
binding.descriptionText.text = resources.getString(
resources.getIdentifier(coin.description,"string", requireContext().packageName)
)
这是一个糟糕的做法吗?有没有一个更有效的实现,让我连接我的数据库条目与他们的资源?
2条答案
按热度按时间ruyhziif1#
也许你可以在数据库之外设置这些值?创建一个描述你的级别的对象,并使用它们的resourceId定义该对象的图像和描述。这些基本上是与UI相关的值,它们根本不应该在数据库中。
krugob8w2#
您可以通过两种方式从assets文件夹或res/raw文件夹获取文本资源( 假设您文件名为product_json.json)**
res/raw
文件夹中,并按以下方式访问。val inputStream: InputStream = resources.openRawResource(R.raw.product_json)
assets
文件夹(如果不存在,那么欢迎你创建一个!)作为访问如下。val inputStream: InputStream = assets.open(getString("project_json")
注意:assets.open(“文件名带扩展名),例如
assets.open("product_json.json")
使用上面的第1点比使用
val inputStream: InputStream = resources.openRawResource( resources.getIdentifier(getString(R.string.product_json), "raw", packageName)
访问资源快,因为getIdentifier()
必须遍历所有字符串资源。这非常慢,不推荐使用,因此,IDE静态分析器显示警告“不鼓励使用此函数,因为资源反射会使代码的生成优化和编译时验证变得更加困难。通过标识符(例如www.example.com)检索资源R.foo.bar比通过名称(例如getIdentifier(“bar”,“foo”,null))"更有效。使用val inputStream: InputStream = resources.openRawResource(R.raw.product_json)
更好,因为系统只需迭代原始资源。