使用 greenDao 持久化字符串数组

Persisting array of strings with greenDao

我正在尝试使用 greenDao 将对象映射到数据库。但是说到数组,我就不知道怎么做了。从网络接收到 JSON 并使用 GSON 反序列化后,我得到了这个 class:

定义的对象
public class Car {
   Long carId;
   String name;
   ArrayList<String> listOfLinks;
} 

如果是不同的架构,像这样:

public class Car {
   Long carId;
   String name;
   ArrayList<Link> listOfLinks;
} 

public class Link {
   Long carId;
   String link;
}

----
Entity cars = schema.addEntity("Car");
cars.addLongProperty("carId").primaryKey();
cars.addStringProperty("name");

Entity links = schema.addEntity("Link");
links.addStringProperty("name");
links.addIdProperty().primaryKey().notNull().autoincrement();

Property linkProperty = links.addLongProperty("carId").getProperty();
ToMany carToLinks = cars.addToMany(link, linkProperty);

这很容易。定义一些关系,定义属性,添加外键,然后就完成了。对于数组,我不知道该怎么做。想法?

这种方法在使用关系数据库时并不常见。 这通常使用对多关系来完成:您可以创建一个 Link 实体,然后使用 Link.

列表,而不是使用字符串列表

我也遇到了同样的问题,一直没有答案(官方文档里没有,google里没有)。请解释如何将列表映射到实体?

public class Car {
   Long carId;
   String name;
   ArrayList<String> listOfLinks;
}

我可以做这样的事情吗?

@Entity(active = true, nameInDb = "CARS")
    public class Car {
        @Id
        private Long id;

        @NotNull
        @Unique
        private String remoteId;

        @ToMany(joinProperties = {
                @JoinProperty(name = "remoteId", referencedName = "carRemoteId")
        })
        private List<Links> listOfLinks;
    }


@Entity(active = true, nameInDb = "LISTOFLINKS")
public class Links{

    @Id
    private Long id;

    @NotNull
    @Unique
    private String remoteId;

    @SerializedName("listOfLinks")
    @Expose
    private String listOfLinks;//is it possible?????

    private String carRemoteId;
}

当你有一个非原始对象的列表时,与许多的关系很有用,你可以声明像具有自己的 id 等的实体,并制作实体列表(使用 toMeny)。通过这样做,greenDao 使用包含列表的基本实体的外键在新实体的基础中创建另一个 table。当您拥有原始类型列表时,唯一的方法是制作将 List 转换为 greenDao 自然工作的原始类型之一的转换器。你必须做这样的事情`

    import org.greenrobot.greendao.converter.PropertyConverter;
    import java.util.Arrays;
    import java.util.List;

    /**
    *DOLE BREEE SQLITE BREEEEEE!!!** 
    *i choosed to convert List into one string 
    *that is going to be saved in database, and vice versa 
    */

    public class GreenConverter implements PropertyConverter, String> {
    @Override
    public List convertToEntityProperty(String databaseValue) {
    if (databaseValue == null) {
    return null;
    }
    else {
    List<String> lista = Arrays.asList(databaseValue.split(","));
    return lista;
    }
    }

    @Override
    public String convertToDatabaseValue(List<String> entityProperty) {
        if(entityProperty==null){
            return null;
        }
        else{
            StringBuilder sb= new StringBuilder();
            for(String link:entityProperty){
                sb.append(link);
                sb.append(",");
            }
            return sb.toString();
        }
    }
    }

现在最重要的是您必须放置的 List 属性 @Convert(转换器=yourconverterclass.class, columnType = String.class)

 @Entity
public class ShipEntry {

@Id(autoincrement = true)
private long ship_id;
private String name;
private String model;
private String manufacturer;
private String starship_class;

@Convert(converter = GreenConverter.class, columnType = String.class)
private List<String> pilots;

@Convert(converter = GreenConverter.class, columnType = String.class)
private List<String> films ;
}

您可以将 Converter 创建为实体的内部 class,在这种情况下,它必须声明为静态的,这是我找到的唯一方法,但不好的一面是您不能使用 属性 你正在转换成查询。可能是我打错了,希望能帮到你解决问题

从 JPA 2.0 开始,您可以使用元素集合来保存值类型的集合。您只需要用 @ElementCollection 注释该属性,持久性提供程序就会将 Collection 的元素持久保存在另一个数据库中 table.

@Entity
public class Author {
 
    @ElementCollection
    private List<String> phoneNumbers = new ArrayList<String>();
  
}

元素集合似乎比具有一对多关联的实体更易于使用。但它有一个主要缺点:集合的元素没有 id,Hibernate 无法单独处理它们。

当您向列表中添加新对象或删除现有对象时,Hibernate 会删除所有元素并为列表中的每个项目插入一条新记录。

让我们快速看一个例子。以下代码片段选择一个 Author 实体并将第二个 phoneNumber 添加到元素集合。

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
 
Author a = em.find(Author.class, 1L);
a.getPhoneNumbers().add("42424242");
 
em.getTransaction().commit();
em.close();

元素集合是在数据库中存储值类型列表的一种简单但不是最有效的选择。因此,您应该只对非常小的集合使用使用它,这样 Hibernate 就不会执行太多 SQL 语句。在所有其他情况下,一对多关联是更好的方法。