java - 安卓房间Base64

标签 java android sqlite android-room

我正在尝试使用 Room 将 base64 值保存到我的 sqlite 数据库中,但由于某种原因它没有保存。好吧,我假设它没有保存,因为当我尝试读取具有 base64 列的表时,它返回除 base64 列之外的所有其他列的值。我做错了什么?

我的实体:

@Entity(tableName = "healthCareWorkerInformation",
        foreignKeys = @ForeignKey(
                entity = HealthCareWorker.class,
                parentColumns = {"id"},
                childColumns = {"hcwId"},
                onDelete = ForeignKey.CASCADE),
        indices = @Index(
                value = {"hcwId"}))
public class HealthCareWorkersInformation {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "hcwInfoId")
    private long id;
    private long hcwId;
    //@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
    private String base64Image;
    private String updatedAt = new SimpleDateFormat("dd MM yyyy, HH:mm",
            Locale.getDefault()).format(Calendar.getInstance().getTime());

    public HealthCareWorkersInformation() {
    }

    @Ignore
    public HealthCareWorkersInformation(long hcwId) {
        this.hcwId = hcwId;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getHcwId() {
        return hcwId;
    }

    public void setHcwId(long hcwId) {
        this.hcwId = hcwId;
    }

    public String getBase64Image() {
        return base64Image;
    }

    public void setBase64Image(String base64Image) {
        this.base64Image = base64Image;
    }

    public String getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(String updatedAt) {
        this.updatedAt = updatedAt;
    }
}

我的 DAO:

@Insert
void insertHealthCareWorkerInformation(HealthCareWorkersInformation healthCareWorkersInformation);

@Query("SELECT * FROM HEALTHCAREWORKERINFORMATION")
LiveData<List<HealthCareWorkerInformation>> getHCWInfo();

我发送的示例数据:

{"consentGiven":null,"hcwId":1,"patiendId":1,"name":"Ben","lastName":"Ben","dateOfBirth":"4/9/2019","phoneNumber":"+271234567","base64Image":"data:image/png;base64,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"}

除 base64 列外,其他所有内容都会被保存。请协助。

最佳答案

问题是 data:image/png;base64, 中的分号与 " 双引号结合使用。

最简单的方法是保存没有该前缀的 base64 字符串,这会破坏语法,然后假设它是所有 PNG 图像(或添加一个进一步的字段,表示每张图片的编码)。

这个问题并不特定于 Room,而是特定于使用 SQLiteJava,因为该分号终止了语句(Room 将生成)。在 Java 中,只能对原始数据类型 char 使用 ' 单引号,而对于复杂数据类型 String 除了 " 双引号。绕过此限制的唯一方法是不要尝试保存包含 ;String .

举例说明我的意思:

private String base64String = null;
private String base64Type = "png";

public String getBase64Image() {
    if(this.base64String != null) {
        return "data:image/" + this.base64Type + ";base64," + this.base64String;
    } else {
        return null;
    }
}

关于java - 安卓房间Base64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590307/

相关文章:

ruby-on-rails - 在现有的 Rails 应用程序上从 Sqlite3 切换到 PostgreSQL

sqlite - 在嵌入式系统/微 Controller 中运行 SQLITE 的最低硬件规范

java - 使用 super csv 通过 Java 写回 csv

java - 根据具有长值的值对映射进行排序

java - 需要一种优雅的方式在指定的时间间隔内调用任意代码

android - Android dex 中的冗余操作码

android - 避免在 CoordinatorLayout 内的 ViewPager 内的底部 View 中滚动

java - 辅助注入(inject)什么时候有用?

android - 如何在android中使用Mediaprojection库捕获屏幕并转换为mp4文件?

linux - 连续循环 SQlite3 数据库,当查询找到前 3 个运行脚本时