使用greenDao保持字符串数组

时间:2015-09-25 15:31:46

标签: android gson greendao

我尝试使用greenDao将对象映射到数据库。但是当谈到阵列时,我不知道该怎么做。从网络接收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);

这很容易。定义一些关系,定义属性,添加外键和完成。使用数组我不知道该怎么做。想法?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果你有一个非原始对象的列表,你可以声明像具有自己的id等的实体等,并且生成实体列表(带有toMeny),那么关系toMany很有用。通过这样做,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();
        }
    }
    }

现在是您必须放置的所有List属性 @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 ;
}

你可以创建Converter作为一个内部类的权利,在这种情况下,它必须被声明为staticthat是我找到的唯一方法,但不好的一面是你不能使用你转换成查询的属性。可能有一些错字,但我希望这有助于解决您的问题

答案 2 :(得分:0)

我也有同样的问题,没有答案(不是官方文档,不是谷歌)。请解释如何将List映射到实体?

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

答案 3 :(得分:0)

从 JPA 2.0 开始,您可以使用元素集合来持久化值类型的集合。您只需要使用@ElementCollection 对属性进行注释,持久化提供程序就会将集合的元素持久化到一个额外的数据库表中。

@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 语句。在所有其他情况下,一对多关联是更好的方法。