【问题标题】:How to store Drawable file in Realm?如何在 Realm 中存储 Drawable 文件?
【发布时间】:2015-12-10 06:34:45
【问题描述】:

我只想在Realm数据库中存储一个Drawable图像文件,但是在Realm Object中分配值后,它显示一条错误消息“错误:不支持字段类型android.graphics.drawable.Drawable”。

public class AppsList extends RealmObject {
    public Drawable getAppIcon() {
      return appIcon;
    }
    public void setAppIcon(Drawable appIcon) {
      this.appIcon = appIcon;
    }
}

    Intent i = new Intent(Intent.ACTION_MAIN, null);
    i.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> availableActivities = manager.queryIntentActivities(
            i, 0);
    for (ResolveInfo ri : availableActivities) {
        realm.beginTransaction();

        appsIconList = realm.createObject(AppsList.class);

        appsIconList.setAppLabel(ri.loadLabel(manager).toString());
        appsIconList.setAppPackageName(ri.activityInfo.packageName.toString());
        appsIconList.setAppIcon(ri.activityInfo.loadIcon(manager).toString());

        realm.commitTransaction();
    }

请仔细阅读我的帖子,告诉我如何在 Realm 数据库中存储可绘制文件。

【问题讨论】:

  • 您可以将可绘制的 id 存储为整数。并稍后检索它。如果它不是您的应用程序可绘制的,那么您应该存储 activityInfo 组件名称。或者最坏的情况,将其转换为位图,然后将其存储为 base64 和更高版本的 base64 > bitmap
  • 什么是"Drawable image file",它与Drawable类有什么关系?
  • 所以我想填充包管理器应用程序图标,并且此函数返回可绘制。我已经更新了我的帖子,请仔细阅读。
  • 那么调用getApplicationIcon(ApplicationInfo info)getActivityIcon(ComponentName activityName) 或任何其他PackageManager 方法有什么问题?
  • 你能告诉我完整的代码吗???

标签: android android-drawable realm


【解决方案1】:

我认为你做不到。 Realm 仅支持这些类型:

INTEGER,
BOOLEAN,
STRING,
BINARY,
DATE,
FLOAT,
DOUBLE,

参考来自:RealmFieldType.java

其实你也可以将drawable的id存储为Integer格式,但还是不推荐,因为每次构建项目时都会生成id,并且有可能与上次保存的不同。

如果您有可绘制对象的名称,您还可以将可绘制对象名称存储到 Realm 数据库并使用此代码获取可绘制对象的 id

Resources resources = context.getResources();
int resourceId = resources.getIdentifier(name, "drawable", 
   context.getPackageName());

【讨论】:

  • 感谢您的回复,好的,但您能告诉我,我有一个动态可绘制名称,并且该名称以字符串格式存储在 Realm 数据库中,那么如何在图像视图中填充该字符串。
  • @user2551103 你知道drawable的名字了吗?
  • @user2551103 如果您有可绘制对象的名称,请查看我编辑的帖子
  • 是的,可绘制名称列表类似于“android.graphics.drawable.BitmapDrawable@18e8f29a”、“android.graphics.drawable.BitmapDrawable@b12c6c1”,所以我只想填充到 imageview .
  • @user2551103 这不是drawable的名称,而是BitmapDrawable Object的字符串表示形式。
【解决方案2】:

Realm 不直接支持 Drawable。您必须首先将 Drawable 转换为可序列化的byte[]。这可能意味着首先将其转换为位图。 @EpicPandaForce 提供的答案是一个好的开始:Drawable to byte[]

虽然开销很大。我建议将 Drawable 保存为文件系统上的文件,并将路径保存在 Realm 中。

【讨论】:

  • 谢谢老兄,我已经应用了@EpicPandaForce 技巧,而且效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多