android开发 greendao学习及使用笔记

一、用GreenDaoGenerator 构建Java的实体模型和DAO工具类
    private static void addBirdStoreEx(Schema schema){
     Entity birdStoreEx = schema.addEntity("BirdStoreEx");
     birdStoreEx.addIdProperty().primaryKey().autoincrement();
     birdStoreEx.addStringProperty("netCode");
     birdStoreEx.addStringProperty("netName");
     birdStoreEx.addStringProperty("expressNumber");
     birdStoreEx.addStringProperty("receiverMobile");
     birdStoreEx.addDateProperty("arriveTime");
     birdStoreEx.addDateProperty("storeTime");
     birdStoreEx.addDateProperty("retrievalTime");
     birdStoreEx.addDateProperty("overdueTime");
     birdStoreEx.addDateProperty("recallTime");
     birdStoreEx.addIntProperty("expressState");
     birdStoreEx.addBooleanProperty("syncData");//是否已上传数据
     birdStoreEx.addStringProperty("remark");//备注
    }
二、表的增删改查

1.查询

范例1:查询某个表是否包含某个id:

public  boolean  isSaved( int  ID)
{
QueryBuilder<SaveList> qb = saveListDao.queryBuilder();
qb.where(Properties.Id.eq(ID));
qb.buildCount().count();
return  qb.buildCount().count() >  0  true  false ;
}

范例2:获取整个表的数据集合,一句代码就搞定!

1
2
3
4
public  List<PhotoGalleryDB> getPhotoGallery()
{
return  photoGalleryDao.loadAll(); // 获取图片相册
}

范例3:通过一个字段值查找对应的另一个字段值(为简便直接使用下面方法,也许有更简单的方法,尚未尝试)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** 通过图片id查找其目录id */
public  int  getTypeId( int  picId)
{
QueryBuilder<PhotoGalleryDB> qb = photoGalleryDao.queryBuilder();
qb.where(Properties.Id.eq(picId));
if  (qb.list().size() >  0 )
{
return  qb.list().get( 0 ).getTypeId();
}
else
{
return  - 1 ;
}
}

范例4:查找所有第一姓名是“Joe”并且以lastname排序。

1
2
3
4
List joes = userDao.queryBuilder()
.where(Properties.FirstName.eq( "Joe" ))
.orderAsc(Properties.LastName)
.list();

范例5:多重条件查询

(1)获取id为cityId并且infotype为HBContant.CITYINFO_SL的数据集合:

1
2
3
4
5
6
7
public  List<CityInfoDB> getSupportingList( int  cityId)
{
QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();
qb.where(qb.and(Properties.CityId.eq(cityId),Properties.InfoType.eq(HBContant.CITYINFO_SL)));
qb.orderAsc(Properties.Id); // 排序依据
return  qb.list();
}

(2)获取firstname为“Joe”并且出生于1970年10月以后的所有user集合:

1
2
3
4
5
QueryBuilder qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq( "Joe" ),
qb.or(Properties.YearOfBirth.gt( 1970 ),
qb.and(Properties.YearOfBirth.eq( 1970 ), Properties.MonthOfBirth.ge( 10 ))));
List youngJoes = qb.list();
源码》》》》》》》》》》》》》》》》》》》》》》》》》》》
    /** Creates an "greater than ('>')" condition for this property. */
    public WhereCondition gt(Object value) {
        return new PropertyCondition(this, ">?", value);
    }
    /** Creates an "less than ('<')" condition for this property. */
    public WhereCondition lt(Object value) {
        return new PropertyCondition(this, "<?", value);
    }
    /** Creates an "greater or equal ('>=')" condition for this property. */
    public WhereCondition ge(Object value) {
        return new PropertyCondition(this, ">=?", value);
    }
    /** Creates an "less or equal ('<=')" condition for this property. */
    public WhereCondition le(Object value) {
        return new PropertyCondition(this, "<=?", value);
    }

范例6:获取某列对象

1
picJsonDao.loadByRowId(picId);

2.增添/插入、修改

插入数据更加简单,也是只要一句代码便能搞定!

1
2
3
4
public  void  addToPhotoTable(Photo p)
{
photoDao.insert(p);
}

修改更新:

1
2
photoDao.insertOrReplace(photo);
photoDao.insertInTx(photo);

3.删除:

(1)清空表格数据

1
2
3
4
5
/** 清空相册图片列表的数据 */
public  void  clearPhoto()
{
photoDao.deleteAll();
}

(2)删除某个对象

1
2
3
4
5
6
public  void  deleteCityInfo( int  cityId)
{
QueryBuilder<DBCityInfo> qb = cityInfoDao.queryBuilder();
DeleteQuery<DBCityInfo> bd = qb.where(Properties.CityId.eq(cityId)).buildDelete();
bd.executeDeleteWithoutDetachingEntities();
}


三、数据库升级
经测试,只要改变表结构,原先的数据内容就会丢失,原因: DevO penHelper中先dropAllTables再新建数据库。因此,为了保留原先表中的数据内容,原理:先把原表复制一份,再往新表上拷贝数据。
具体步骤如下:
1.先升级表,run as Java application

2. 在DaoMaster类里有个内部类DevO penHelper里的方法onUpgrade里写上数据库结构变化的代码,比如某个表新增字段,并要把里面dropAllTables和onCreate方法删掉

3. MigrationHelper.getInstance().migrate(db,
UserDao.class, ItemDao.class);


四、keep代码







五、最后附上 MigrationHelper.java

/**

 * Created by pokawa on 18/05/15.

 */

public class MigrationHelper {


    privatestatic final String CONVERSION_CLASS_NOT_FOUND_EXCEPTION ="MIGRATION HELPER - CLASS DOESN'T MATCH WITH THE CURRENT PARAMETERS";

    private static MigrationHelperinstance;


    public static MigrationHelper getInstance() {

        if(instance ==null) {

            instance = new MigrationHelper();

        }

        return instance;

    }


    public void migrate(SQLiteDatabase db, Class<?extends AbstractDao<?, ?>>... daoClasses) {

        generateTempTables(db, daoClasses);

        DaoMaster.dropAllTables(db, true);

        DaoMaster.createAllTables(db, false);

        restoreData(db, daoClasses);

    }


    private void generateTempTables(SQLiteDatabase db, Class<?extends AbstractDao<?, ?>>... daoClasses) {

        for(int i = 0; i < daoClasses.length; i++) {

            DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);


            String divider = "";

            String tableName = daoConfig.tablename;

            String tempTableName = daoConfig.tablename.concat("_TEMP");

            ArrayList<String> properties = new ArrayList<String>();


            StringBuilder createTableStringBuilder = new StringBuilder();


            createTableStringBuilder.append("CREATE TABLE ").append(tempTableName).append(" (");


            for(int j = 0; j < daoConfig.properties.length; j++) {

                String columnName = daoConfig.properties[j].columnName;


                if(getColumns(db, tableName).contains(columnName)) {

                    properties.add(columnName);


                    String type = null;


                    try {

                        type = getTypeByClass(daoConfig.properties[j].type);

                    } catch (Exception exception) {

                    }


                    createTableStringBuilder.append(divider).append(columnName).append(" ").append(type);


                    if(daoConfig.properties[j].primaryKey) {

                        createTableStringBuilder.append(" PRIMARY KEY");

                    }


                    divider = ",";

                }

            }

            createTableStringBuilder.append(");");


            db.execSQL(createTableStringBuilder.toString());


            StringBuilder insertTableStringBuilder = new StringBuilder();


            insertTableStringBuilder.append("INSERT INTO ").append(tempTableName).append(" (");

            insertTableStringBuilder.append(TextUtils.join(",", properties));

            insertTableStringBuilder.append(") SELECT ");

            insertTableStringBuilder.append(TextUtils.join(",", properties));

            insertTableStringBuilder.append(" FROM ").append(tableName).append(";");


            db.execSQL(insertTableStringBuilder.toString());

        }

    }


    private void restoreData(SQLiteDatabase db, Class<?extends AbstractDao<?, ?>>... daoClasses) {

        for(int i = 0; i < daoClasses.length; i++) {

            DaoConfig daoConfig = new DaoConfig(db, daoClasses[i]);


            String tableName = daoConfig.tablename;

            String tempTableName = daoConfig.tablename.concat("_TEMP");

            ArrayList<String> properties = new ArrayList<String>();


            for (int j = 0; j < daoConfig.properties.length; j++) {

                String columnName = daoConfig.properties[j].columnName;


                if(getColumns(db, tempTableName).contains(columnName)) {

                    properties.add(columnName);

                }

            }


            StringBuilder insertTableStringBuilder = new StringBuilder();


            insertTableStringBuilder.append("INSERT INTO ").append(tableName).append(" (");

            insertTableStringBuilder.append(TextUtils.join(",", properties));

            insertTableStringBuilder.append(") SELECT ");

            insertTableStringBuilder.append(TextUtils.join(",", properties));

            insertTableStringBuilder.append(" FROM ").append(tempTableName).append(";");


            StringBuilder dropTableStringBuilder = new StringBuilder();


            dropTableStringBuilder.append("DROP TABLE ").append(tempTableName);


            db.execSQL(insertTableStringBuilder.toString());

            db.execSQL(dropTableStringBuilder.toString());

        }

    }


    private String getTypeByClass(Class<?> type)throws Exception {

        if(type.equals(String.class)) {

            return "TEXT";

        }

        if(type.equals(Long.class) || type.equals(Integer.class) || type.equals(long.class)) {

            return "INTEGER";

        }

        if(type.equals(Boolean.class)) {

            return "BOOLEAN";

        }


        Exception exception = new Exception(CONVERSION_CLASS_NOT_FOUND_EXCEPTION.concat(" - Class: ").concat(type.toString()));

        throw exception;

    }


    private static List<String> getColumns(SQLiteDatabase db, String tableName) {

        List<String> columns = new ArrayList<String>();

        Cursor cursor = null;

        try {

            cursor = db.rawQuery("SELECT * FROM " + tableName +" limit 1", null);

            if (cursor != null) {

                columns = new ArrayList<String>(Arrays.asList(cursor.getColumnNames()));

            }

        } catch (Exception e) {

            Log.v(tableName, e.getMessage(), e);

            e.printStackTrace();

        } finally {

            if (cursor != null)

                cursor.close();

        }

        return columns;

    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值