gson 使用greenDao持久化字符串数组

tyg4sfes  于 2022-11-06  发布在  Java
关注(0)|答案(4)|浏览(222)

我在尝试用greenDao把一个对象Map到数据库,但是到了数组的时候,我就不知道怎么做了,从网络上接收到JSON,用GSON反序列化之后,我就有了这个类定义的对象:

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);

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

0s7z1bwu

0s7z1bwu1#

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

zwghvu4y

zwghvu4y2#

当你有一个非原始对象的列表时,RelationtoMany是很有用的,你可以声明像实体一样有自己的id等等,等等。并列出实体清单通过这样做greenDao为您的新实体在基表中创建另一个表,该表具有包含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();
        }
    }
    }

现在,在列表中的所有属性之上,您必须放置**@Convert(converter=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 ;
}

你可以创建转换器作为实体的内部类,在这种情况下,它必须声明为静态,这是我发现的唯一方法,但坏的一面是,你不能使用属性,你正在转换为查询。可能有我一些打字错误,但我希望这有助于解决你的问题

h9a6wy2h

h9a6wy2h3#

我也有同样的问题,并没有答案(不是在官方文档,不是在谷歌)。请解释如何Map列表到实体?

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;
}
ukxgm1gy

ukxgm1gy4#

从JPA 2.0开始,您可以使用元素集合来持久化值类型的集合。您只需要使用@ElementCollection注解该属性,持久性提供程序就会将集合的元素持久化到其他数据库表中。

@Entity
public class Author {

    @ElementCollection
    private List<String> phoneNumbers = new ArrayList<String>();

}

元素集合似乎比具有一对多关联的实体更容易使用,但它有一个主要缺点:集合中的元素没有id,Hibernate无法单独处理它们。
当您将新Object添加到List或删除现有Object时,Hibernate将删除所有元素并为List中的每个项目插入一条新记录。
下面的代码片段选择了一个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语句。在所有其他情况下,一对多关联是更好的方法。

相关问题