【问题标题】:Does resource id changes everytime an application starts每次应用程序启动时资源ID都会改变吗
【发布时间】:2014-07-19 05:28:17
【问题描述】:

我将我的图像存储在 drawable 中,并将它们的资源 ID 存储在 SQLite 数据库中。我的数据库是在应用程序第一次启动时创建的。

将图像id保存在数据库中好还是每次应用程序启动时id都会改变?

如果 id 发生变化,那么在取回图像 id 时我可能会收到错误。那么,将图像 ID 存储在数据库中是个好主意吗?

我需要将图像路径与其他相关数据一起存储在数据库中,这就是我将图像 ID 存储在数据库中的原因。

【问题讨论】:

  • 我不认为每次启动都会改变。id应该在编译代码时生成。
  • 不,将图像 ID 存储在数据库中是个坏主意,因为如果您推送更新,它们将无效。
  • @GabeSechan-thnx 建议我会找到一个替代解决方案。

标签: android android-sqlite


【解决方案1】:

一种方法是将可绘制对象存储在 strings.xml 中作为字符串数组,如下所示:

 <string-array name="location_flags">
    <item>@drawable/ic_image_name</item>
    <item>@drawable/ic_image_name</item>
    <item>@drawable/ic_image_name</item>
    <item>@drawable/ic_image_name</item>
    <item>@drawable/ic_image_name</item>
    <item>@drawable/ic_image_name</item>
    <item>@drawable/ic_image_name</item>
</string-array>

然后在您的活动代码中读取此数组:

TypedArray locationFlags=getResources().obtainTypedArray(R.array.location_flags);

然后应用 for 循环,你可以得到类似这样的 Drawable:

for(int i=0i<locationFlags.length();i++)
 {

   Drawable drawable = locationFlags.getResourceId(i, -1);
 }

使用后请务必回收 TypedArray,因为它是共享资源:

 locationFlags.recycle();

【讨论】:

  • 不确定它是否会工作,因为图像链接到数据库中的一些数据,我想沿着数据获取它。有很多图像,所以我怀疑上述方法是否有效与否。
  • 你没有提到数据和图像之间的任何关系,所以我建议上述解决方案。
  • getResourceId(i, -1) 应该是 Int 而不是 Drawable
【解决方案2】:

最好的办法是直接把图片名存入数据库,取出来,然后使用

int resID = this.getResources().getIdentifier("your photo name fetched from database","drawable","package name");

image.setResourceID(resID);

【讨论】:

    【解决方案3】:

    存储 id 是个坏主意,但你的目的是什么? 更好的主意是将缩略图存储到数据库而不是 ids .. 这对我有帮助 may this example help you 执行以下步骤

    1. 获取图片的缩略图

      final int thumbnailSize = 128;// 定义你的尺寸

      位图 ThumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(imagePath), 拇指大小,拇指大小);

    2. 转换成字节数组

      位图图像 = BitmapFactory.decodeResource(getResources(), R.drawable.thumbnail); ByteArrayOutputStream out = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, out); byte[] 缓冲区=out.toByteArray();

    3. 将其保存为 Blob

      ContentValues cv=new ContentValues(); cv.put(块,缓冲区); //你的表的CHUNK blob类型字段 长 rawId=database.insert(TABLE, null, cv); //TABLE 表名

      我没有用过这个,但这可能对你有帮助

    【讨论】:

    • 您的意思是将图像作为 BLOB 文件存储在数据库中吗?
    • 图片很重,而且数量也更多,所以存储为 blob 不是一种选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2021-03-18
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多