GreenDao初学

关于GreenDao的初步学习,本想着用Android studio来学习的,可是无奈电脑内存太小,装上之后,完全卡的不能用,所以暂用eclipse来学习

编译工具:eclipse-android-neon-2-incubation-win32

jar包:freemarker-2.3.25-incubating.jar     greendao-generator-2.1.0.jar  greendao-2.1.0.jar (特别说明一下,greendao的版本其实已经升到3.X.X了,可是因为编译生成的文件里面含有注释,类似于@Id,@Name,在eclipse里无法解决,所以用低版本的)

jdk版本为1.7

步骤:

1.首先创建一个java工程,工程名字叫greendaogenerate



2. 把下载好的greendao jar包:freemarker-2.3.25-incubating.jar 和 greendao-generator-2.1.0.jar放进 java工程的libs中


3.创建GreenDaoGenerate.java文件,内容如下:


package greendaogenerate;

import java.io.IOException;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Property;
import de.greenrobot.daogenerator.Schema;

public class GreenDaoGenerate {

	public static void main(String[] args) {
		// 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。
		// 两个参数分别代表:数据库版本号与自动生成代码的包路径。
		Schema schema = new Schema(2, "www.imooc.com");
		// 当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示:
		// Schema schema = new Schema(1, "www.imooc.com.bean");
		// schema.setDefaultJavaPackageDao("www.imooc.com.dao");

		// 儿子表
		// 一个实体(类)就关联到数据库中的一张表,此处表名为「Son」(既类名)
		Entity son = schema.addEntity("Son");
		
		// greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值  
        // 接下来你便可以设置表中的字段:
		son.addStringProperty("name");
		son.addIntProperty("age");
		son.addIdProperty();
		
		//设置fatherId为son表的外键
		Property fatherId = son.addLongProperty("fatherId").getProperty();

		// 父亲表
		Entity father = schema.addEntity("Father");
		father.addIdProperty();
		father.addStringProperty("name");
		father.addIntProperty("age");

		// 一对一的关系 一个儿子对应一个父亲
		son.addToOne(father, fatherId);

		// 一对多的关系 一个父亲对应多个儿子
		// Property sonId = son.addLongProperty("sonId").getProperty();
		// father.addToOne(son, sonId);
		// son.addToMany(father, sonId).setName("fathers");
		
		// 最后我们将使用 DaoGenerator 类的 generateAll()
		// 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的目录就发在src下)。
		try {
			new DaoGenerator().generateAll(schema, "../GreenDaoGenerate/src");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
4.编译运行,生成文件,点击项目刷新或F5才能看到,此时文件是带红叉的,需要拷贝到Android工程目录下



5.Android工程是提前创建好的,拷贝过去,在libs目录下导入greendao-2.1.0.jar 然后需要把拷贝过来的文件中之前的工程路径删去 如:import www.imooc.com.xxxx;这样就没有错误了。

DaoMaster:一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelperDevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。

DaoSession:会话层。操作具体的DAO对象(注意:是对象),比如各种getter方法。

XXXDao:实际生成的某某DAO类,通常对应具体的java类,比如NoteDao等。其有更多的权限和方法来操作数据库元素。

XXXEntity:持久的实体对象。通常代表了一个数据库row的标准java properties。


6.下面是MainActivity的内容

public class MainActivity extends Activity {

    //greenDAO提供的帮助类
    private DaoMaster master;
    private DaoSession session;
    private SQLiteDatabase db;
    private SonDao sonDao;
    private FatherDao fatherDao;
    private void openDb(){
        //创建一个名为person.db的数据库
        db = new DaoMaster.DevOpenHelper(MainActivity.this,"person.db",null).getWritableDatabase();
        master = new DaoMaster(db);
        session = master.newSession();
        //获得son表操作数据库类的对象
        sonDao = session.getSonDao();
        //获得father表操作数据库类的对象
        fatherDao = session.getFatherDao();
    }

    //插入数据
    private void addPerson(){
    //下面代码具体得根据数据库表的关系,这里只是示例(son有多个father)
        Son son = new Son();
        son.setName("nate");
        son.setAge(29);
        sonDao.insert(son);

        Father father = new Father();
        father.setName("Tom");
        father.setSon(son);
        fatherDao.insert(father);

        Father father2 = new Father();
        father2.setName("Jane");
        father2.setSon(son);
        fatherDao.insert(father2);

    }

//常用api:
//list() 直接取出数据返回一个list并缓存数据
//listLazy() 不直接取出数据返回一个list有缓存,需手动close
//listLazyUncached() 延迟加载返回一个list不缓存数据,需手动close
//listIterator() 遍历数据,返回一个迭代器

    public void queryAll(){
        //listLazy()懒加载,多个表级联查询使用最佳
       List<Son> list = sonDao.queryBuilder().list();//查询son表中的所有数据,返回集合
       for (Son son: list){
           Log.d("nate","queryAll() called with: "+son);
       }
    }

    //条件查询: Eq 查询
    public void queryEq(){
       Son nate =  sonDao.queryBuilder().where(SonDao.Properties.Name.eq("nate")).unique();
       Log.d("nate","queryEq called with:"+ nate);
    }

    //条件查询: like 查询
    public void queryLike(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Name.like("nate%")).list();
        Log.d("nate","queryEq called with:"+ data);
    }

    //条件查询: between 查询
    public void queryBetween(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.between(16,20)).list();
        Log.d("nate","queryBetween called with:"+ data);
    }

    //条件查询: > 大于 查询
    public void queryGt(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.gt(16)).list();
        Log.d("nate","queryGt called with:"+ data);
    }

    //条件查询: < 小于 查询
    public void queryLt(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.lt(16)).list();
        Log.d("nate","queryLt called with:"+ data);
    }

    //条件查询: NotEq 查询
    public void queryNotEq(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.notEq(16)).list();
        Log.d("nate","queryNotEq called with:"+ data);
    }

    //条件查询: GE 大于等于 查询
    public void queryGE(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Age.ge(16)).list();
        Log.d("nate","queryGE called with:"+ data);
    }

    //条件查询: 排序 查询
    public void queryOrder(){
        List data =  sonDao.queryBuilder().where(SonDao.Properties.Name.like("nate%"))
                .orderDesc(SonDao.Properties.Age).list();
        Log.d("nate","queryOrder called with:"+ data);
    }

    //拼装sql语句查询,在api无法满足查询需求的情况下使用
    public void querySQL(){
        List data =  sonDao.queryBuilder()
                .where(new WhereCondition.StringCondition(
                        "FATHER_ID IN" +"{SELECT _ID FROM FATHER WHERE AGE <50}"
                )).list();
        Log.d("nate","querySQL called with:"+ data);
    }

    //多线程查询:有兴趣可以看源码
    public void queryThread(){
        final Query query = sonDao.queryBuilder().build();
        new Thread(){
            @Override
            public void run() {
                List data = query.forCurrentThread().list();
                Log.d("nate","queryThread called with:"+ data);
            }
        };
    }
    //一对多查询:具体得看数据表关系
    public void queryOneToMany(){
        List<Son> sons = sonDao.queryBuilder().list();//查询son表中的所有数据,返回集合
        for (Son son:sons){
            List<Father> fathers = son.getFathers();
            for (Father father:fathers){
                Log.d("nate","queryOneToMany() called with: "+son.getName()+" father:"+father.getName());
            }
        }
    }
    //一对一查询:具体得看数据表关系
    public void queryOneToOne(){
        List<Son> sons = sonDao.queryBuilder().list();//查询son表中的所有数据,返回集合
        for (Son son:sons){
           // Log.d("nate","queryOneToOne() called with: "+son.getFather().getName());
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //打开一个数据库
         openDb();

        //向数据库添加person
         addPerson();

        //设置打印sql语句,方便查看
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;

        //选择具体需要的查询方式测试:如queryOrder
        queryOrder();

    }
}


对于GreenDao更深层次的运用还没学到,先了解大概的用法,会用了才能理解的更深




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值