greendao 支持c 字符串类型类型吗

4228人阅读
【Android 新技术预研】(49)
【Android 数据持久化】(6)
【Android 基础】(147)
有时候,我们的实体类中会有一些属性,但是数据库中没有对应的类型,这个时候我们就需要自定义转换器进行类型转换。很常见的处理就是Date类型一般如果精度要求不高的话我们会转换为Long类型进行存储,读取的的时候再讲其转换为Date类型。那么如果我们想要让它直接以时间字符串存储呢,这个也好办,GreenDao为我们提供了自定义类型转换的支持。
首先,我们需要实现PropertyConverter接口,实现里面的两个方法convertToEntityProperty和convertToDatabaseValue,该接口需要两个泛型参数,第一个参数是实体类中的类型,第二个参数是数据库中存储的类型。现在假设我们需要将Date转换为String进行存储,那么接口的实现应该是这样的。
public class DateStringConverter implements PropertyConverter&Date,String& {
public Date convertToEntityProperty(String databaseValue) {
return null;
public String convertToDatabaseValue(Date entityProperty) {
接下来我们进行转换
public class DateStringConverter implements PropertyConverter&Date,String& {
private static final String DEFAULT_FORMAT="yyyy-MM-dd HH:mm:ss";
public Date convertToEntityProperty(String databaseValue) {
return convert2Date(databaseValue,DEFAULT_FORMAT);
public String convertToDatabaseValue(Date entityProperty) {
return convert2String(entityProperty,DEFAULT_FORMAT);
public static String convert2String(Date date,String format){
String currentDate=null;
SimpleDateFormat formatter=new SimpleDateFormat(format);
currentDate=formatter.format(date);
}catch (Exception e){
e.printStackTrace();
return currentD
public static Date convert2Date(String day, String format) {
if (day == null || format == null)
return null;
SimpleDateFormat formatter = new SimpleDateFormat(format);
Date dt = formatter.parse(day);
} catch (ParseException e) {
e.printStackTrace();
return null;
之后生成实体类
Entity type = schema.addEntity("Demo");
type.addStringProperty("test").customType("java.util.Date","cn.edu.zafu.greendao.db.converter.DateStringConverter");
addProperty的时候是对应的数据库中的类型,这里我们存储为字符串,所以是addStringProperty,然后通过customType函数指定实体类中的类型,这里是java.util.Date,接着就是我们的类型转换器的全类名。接着试试往数据库中插入一条数据,我们会发现他直接以字符串存储了,如图所示
最后附带一下混淆配置,给需要混淆的项目加入以下语句
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao {
public static java.lang.String TABLENAME;
-keep class **$Properties
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:693927次
积分:8878
积分:8878
排名:第1773名
原创:162篇
评论:632条
阅读:63360
阅读:16750
阅读:78455
阅读:20415
阅读:30210Android-在 GreenDao 数据库中添加默认值
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
我想问问,如果有可能性时创建 greenDao 数据库添加默认值吗?
Property pictureIdProperty = user.addLongProperty("pictureId").getProperty();
Property thumbnailIdProperty = user.addLongProperty("thumbnailId").getProperty();
//and here I need something like this:
//thumbnailIdProperty.setDefault(-1); //there is possible to add
user.addToOne(picture, pictureIdProperty);
user.addToOne(picture, thumbnailIdProperty, "thumbnail");
当我使用数据库和表的那就无需创建此模型时,总是添加默认值。
解决方法 1:
我不相信有任何官方支持由 GreenDAO 项目为此从今天开始,但我有个主意。Sqlite 支持表约束可以应用于列。对于,下面的代码块显示的默认值为 City 表中的列 Persons 是 '桑'。
CREATE TABLE Persons
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
知道 sqlite 支持 Default 的限制,我们可以破解生成的 DAO 类。我将使用作为一个例子。下面的代码段是 GreenDAO 生成代码 create table 代码块:
public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
String constraint = ifNotExists? "IF NOT EXISTS ": "";
db.execSQL("CREATE TABLE " + constraint + "'ORDERS' (" + //
"'_id' INTEGER PRIMARY KEY ," + // 0: id
"'DATE' INTEGER," + // 1: date
"'CUSTOMER_ID' INTEGER NOT NULL );"); // 2: customerId
现在我们可以对此进行支持最有可能修改 DEFUALT 约束。通过添加更改上面的代码块中的最后一个有关行 DEFAULT(-1) 。
"'CUSTOMER_ID' INTEGER NOT NULL DEFAULT(-1));"); // 2: customerId
注: 测试时此更改,请确保您 sqlite 架构版本递增或重新安装您的应用程序,以便重新创建数据库获取。}

我要回帖

更多关于 日期类型转换成字符串 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信