关于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的静态方法,其内部类OpenHelper和DevOpenHelper实现了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更深层次的运用还没学到,先了解大概的用法,会用了才能理解的更深