1.先配置最外面的build.gradle 添加 classpath'org.greenrobot:greendao-gradle-plugin:3.2.2'
2.再到项目的build.gradle里面配置 applyplugin:'org.greenrobot.greendao'
导包 compile 'org.greenrobot:greendao:3.2.2'
添加greendao 然后再设置文件生成位置
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'comqq.example.hasee.myapplication.greendao' //设置生成文件的包名
targetGenDir 'src/main/java' //设置生成文件的目录
generateTests true //设置自动生成单元测试用例
targetGenDirTests 'src/androidTest/gen' //设置生成单元测试目录
}
3.创建一个实体类
@Entity
public class User {
@Id
private Long id;
@Property
private String name;
@Transient
private int temp;
//***常用注解
//实体@Entity注解
//@Entity表示这个实体类在数据库中生成对应的表,告诉GreenDao该对象为实体只有被@Entity的实体类才能被dao类操作
//@Id
//表示该字段是id,注意该字段的数据类型为Long,(autoincrement = true)表示主键会自增
//@Property
// 则表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
//@Transient
//汉语意思:短暂的,临时的!该注解表示这个属性将不会作为数据表中的一个字段,也就是意味着不存储在数据库中
//@NotNull
// 表示该字段不可以为空
//@Generated
//由greendao产生的构造函数或方法,构造函数、方法等不能被修改
//索引注解:
//@Unique
//汉语意思:唯一的,独一无二的.使用该注解表示该字段唯一!
//关系注解:
//@ToOne 一对一,定义与另一个实体(一个实体对象)的关系
//@ToMany 一对多,定义与多个实体对象的关系
}
4.生成3个类
如图所示的3个类
5.在创建一个类继承Application
public class chushihua extends Application {
private SQLiteDatabase database;
private DaoSession daoSession;
private UserDao userDao;
private static chushihua chu;
@Override
public void onCreate() {
super.onCreate();
chu=this;
//先初始化 给数据库取一个名字
DaoMaster.DevOpenHelper de=new DaoMaster.DevOpenHelper(this,"fake",null);
//得到Database工具类
database = de.getWritableDatabase();
//得到DaoMaster对象
DaoMaster daoMaster = new DaoMaster(database);
//得到DaoSession对象
daoSession = daoMaster.newSession();
//得到自动创建的UserDao对象
userDao= daoSession.getUserDao();
}
public SQLiteDatabase getDatabase() {
return database;
}
public DaoSession getDaoSession() {
return daoSession;
}
public static chushihua getInstance(){
return chu;
}
public UserDao getUserDao() {
return userDao;
}
}
5.2上面既然继承了Application 就别忘记在AndroidManifest清单文件中注册 name
6.主函数 这里肯定是会报错的,因为里面有些东西我提前写了,需要的三个类下面会生成
package comqq.example.hasee.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import comqq.example.hasee.myapplication.greendao.CarDao;
import comqq.example.hasee.myapplication.greendao.PictureDao;
import comqq.example.hasee.myapplication.greendao.TeacherDao;
import comqq.example.hasee.myapplication.greendao.UserDao;
public class MainActivity extends AppCompatActivity {
private UserDao user;
private int sum=1;
private CarDao carDao;
private PictureDao pictureDao;
private TeacherDao teacherDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
user=chushihua.getInstance().getUserDao();
//先得到刚才自动生成的3个对象
teacherDao = chushihua.getInstance()
.getDaoSession()
.getTeacherDao();
pictureDao = chushihua
.getInstance()
.getDaoSession()
.getPictureDao();
carDao = chushihua
.getInstance()
.getDaoSession()
.getCarDao();
}
public void cc(View view) {
switch (view.getId()) {
case R.id.but1:
//添加一条数据
long insert = user.insert(new User() {
{
setName("我是你爹");
setId(1);
sum++;
}
});
if (insert > 0) {
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show(); }
else {
Toast.makeText(this, "添加失败", Toast.LENGTH_SHORT).show();
}
break;
case R.id.but2:
//删除一条数据
user.deleteByKey(1l);
break;
case R.id.but3:
//修改一条数据
user.update(new User(){
{
setName("我啥也不是");
setId(1l);
}
});
Toast.makeText(this, "数据修改", Toast.LENGTH_SHORT).show();
break;
case R.id.but4:
//查询一条数据
User use = user.load(1l);
if (null != use) {
Toast.makeText(this, use.toString(), Toast.LENGTH_SHORT).show(); }
else {
Toast.makeText(this,"查询的数据不存在!!", Toast.LENGTH_SHORT).show();
}
break;
case R.id.but5:
//插入一个集合的数据,insertList
user.insertInTx(new ArrayList<User>(){
{
for (int i = 10; i <= 15; i++) {
int num = i + 1;
num++;
add(new User(num,"sb"));
}
add(new User(20l, "李四"));
add(new User(21l, "李四"));
add(new User(22l, "李四"));
add(new User(23l, "李四"));
}
});
break;
case R.id.but6:
List<User> list = user.queryBuilder().list();
for (int i = 0; i <list.size() ; i++) {
Toast.makeText(this,list.get(i).toString(), Toast.LENGTH_SHORT).show();
}
break;
case R.id.but7:
//查询指定姓名为sb的数据
List<User> sb = user.queryBuilder().where(UserDao.Properties.Name.eq("sb")).list();
for (int i = 0; i <sb.size() ; i++) {
Toast.makeText(this,sb.get(i).toString(), Toast.LENGTH_SHORT).show();
}
break;
case R.id.but8:
//查询指定姓名为sb的信息并按照年龄排序-降序
List<User> students = user
.queryBuilder()
.where(UserDao.Properties.Name.eq("sb")) //如果还想添加条件 加一个,接着在后面写就行了
.orderDesc(UserDao.Properties.Id) //orderAsc是升序 这里我就用id大小来排序了
.list();
Toast.makeText(this, students.toString(), Toast.LENGTH_SHORT).show();
for (User student : students) {
Toast.makeText(this, student.toString(), Toast.LENGTH_SHORT).show();
}
break;
case R.id.but9:
//查询所有数据,只取前3条
List<User> list1 = user.queryBuilder().limit(3).list();
for (int i = 0; i <list1.size() ; i++) {
Toast.makeText(this, list1.get(i).toString(), Toast.LENGTH_SHORT).show();
}
break;
case R.id.but10:
//查询所有,只要前3条,从指定条数2索引处的下一条开始查询
List<User> list2 = user.queryBuilder().limit(3).offset(2).list();
for (int i = 0; i <list2.size() ; i++) {
Toast.makeText(this, list2.get(i).toString(), Toast.LENGTH_SHORT).show();
}
user.count();//这是查询数据的总条数
break;
case R.id.but11:
//修改姓名sb的姓名
User sb1 = user.queryBuilder().where(UserDao.Properties.Name.eq("我是你爹")).unique();
if(sb1!=null){
sb1.setName("我是");
user.update(sb1);
Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "没有这个数据", Toast.LENGTH_SHORT).show();
}
break;
case R.id.but12:
//删除指定姓名为sb的数据
user.queryBuilder().where(UserDao.Properties.Name.eq("sb"))
.buildDelete()
.executeDeleteWithoutDetachingEntities();
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
break;
case R.id.but13:
//通过指定对象删除数据,删除我是你爹
User sb2 = user.queryBuilder().where(UserDao.Properties
.Name.eq("我是你爹"))
.unique();
user.delete(sb2);
Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
break;
case R.id.but14:
//删除所有数据
user.deleteAll();
break;
case R.id.but15:
break;
case R.id.but16:
break;
}
}
}
7.主布局
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="comqq.example.hasee.myapplication.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/but1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增加一条数据"
android:onClick="cc"/>
<Button
android:id="@+id/but2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除一条数据"
android:onClick="cc"/>
<Button
android:id="@+id/but3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改一条数据"
android:onClick="cc"/>
<Button
android:id="@+id/but4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询一条数据"
android:onClick="cc"/>
<Button
android:id="@+id/but5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入一个集合的数据,insertList"
android:onClick="cc"/>
<Button
android:id="@+id/but6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询所有数据"
android:onClick="cc"/>
<Button
android:id="@+id/but7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询指定姓名为sb的数据"
android:onClick="cc"/>
<Button
android:id="@+id/but8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询指定姓名为sb的信息并按照id-降序"
android:onClick="cc"/>
<Button
android:id="@+id/but9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询所有数据,只取前3条"
android:onClick="cc"/>
<Button
android:id="@+id/but10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查询所有,只要前3条,从指定条数2索引处的下一条开始查询"
android:onClick="cc"/>
<Button
android:id="@+id/but11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改姓名为我是你爹的姓名"
android:onClick="cc"/>
<Button
android:id="@+id/but12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除指定姓名为sb的数据"
android:onClick="cc"/>
<Button
android:id="@+id/but13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过指定对象删除数据,删除我是你爹"
android:onClick="cc"/>
<Button
android:id="@+id/but14"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除所有数据"
android:onClick="cc"/>
<Button
android:id="@+id/but15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入picture数据"
android:onClick="cc"/>
<Button
android:id="@+id/but16"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入car数据"
android:onClick="cc"/>
</LinearLayout>
</ScrollView>
8.接着往下写 下面写到的是一对一和一对多 @ToOne @ToMany 下面的这些属于扩展的知识可以不写 上面的那些就是GreenDao的基本使用
先创建一对一的类 Picture
@Entity
public class Picture {
@Id(autoincrement = true)
private Long pictureId;
@NotNull
@Unique
private String url;
}
创建一对多的类 Car
@Entity(nameInDb = "car_tb",createInDb = true,generateGettersSetters = true,generateConstructors = true)
public class Car {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "ownerId")
private Long ownerId;
@NotNull
@Property(nameInDb = "carname")
private String carName;}
9.最后在创建之前两个类的连接的类 Teacher 你也可以只写一个类
@Entity(
// 如果有一个以上的模式,可以告诉greendao实体属于哪个模式。
//默认schema = "default",
//schema = "default",
// 标志允许实体类可有更新,删除,刷新方法
active = true,
//指定数据库中表的名称,默认情况下,该表的名称是实体类名。
nameInDb = "fake.db",
// true表示greenDAO创建数据库表(默认为true),如果不用greenDAO创建表,将此设置为false。
createInDb = true,
// 是否应该生成所有的属性构造函数。无参构造函数总是要生成的
generateConstructors = true,
// 是否生成属性的getter和setter
generateGettersSetters = true
)
public class Teacher {
@Id
private Long id;
private String name;
private Long pictureId;
@ToOne(joinProperty = "pictureId")
private Picture picture;
@NotNull
private int age;
@ToMany(referencedJoinProperty = "ownerId")
private List<Car> cars;
10.然后再点Build--Make Module
11.就会出现以下三个类
12.然后接着在之前的主函数里面写
//先得到刚才自动生成的3个对象
teacherDao = chushihua.getInstance()
.getDaoSession()
.getTeacherDao();
pictureDao = chushihua
.getInstance()
.getDaoSession()
.getPictureDao();
carDao = chushihua
.getInstance()
.getDaoSession()
.getCarDao();
13.操作方法接着之前的点击事件里面写
case R.id.but15:
//插入picture数据
for (int i = 0; i <5 ; i++) {
pictureDao.insert(new Picture(null,""+i));
}
Toast.makeText(this, "添加picture数据成功", Toast.LENGTH_SHORT).show();
break;
case R.id.but16:
//插入car数据
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Car car = new Car();
car.setOwnerId(i + 1l);
if (i == 0) {
car.setCarName("白车" + j);
} else if (i == 1) {
car.setCarName("黑车" + j);
} else if (i == 2) {
car.setCarName("红车" + j);
} else if (i == 3) {
car.setCarName("蓝车" + j);
} else if (i == 4) {
car.setCarName("黄车" + j);
}
carDao.insert(car);
}
}
Toast.makeText(this, "添加car数据成功", Toast.LENGTH_SHORT).show();
break;
case R.id.but17:
//插入teacher数据
for (int i = 0; i < 5; i++) {
Long pictureId = i + 1l;
Long ownerId = i + 10l;
// teacherDao.insert(new Teacher(null, "teacher" + i, pictureId, 20 + i));
Teacher teacher = new Teacher(null, "teacher" + i, pictureId, 20 + i);
teacher.resetCars();
teacherDao.insert(teacher);
}
Toast.makeText(this, "添加teacher数据", Toast.LENGTH_SHORT).show();
break;
case R.id.but18:
//获取指定teacher1的picture
Teacher teacher1 = teacherDao.queryBuilder()
.where(TeacherDao.Properties.Name.eq("teacher1"))
.unique();
if (null != teacher1) {
Picture picture = teacher1.getPicture();
Toast.makeText(this, picture.toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "数据不存在", Toast.LENGTH_SHORT).show();
}
break;
case R.id.but19:
//获取指定teacher2的car
Teacher teacher2 = teacherDao.queryBuilder()
.where(TeacherDao.Properties.Name.eq("teacher2"))
.unique();
if (null != teacher2) {
List<Car> carList = teacher2.getCars();
Toast.makeText(this, carList.toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "数据不存在", Toast.LENGTH_SHORT).show();
}
break;
case R.id.but20:
//获取所有picture
List<Picture> pictures = pictureDao
.loadAll();
Toast.makeText(this, pictures.toString(), Toast.LENGTH_SHORT).show();
for (Picture pic : pictures) {
Toast.makeText(this, pic.toString(), Toast.LENGTH_SHORT).show();
}
break;
case R.id.but21:
//获取所有car
List<Car> cars = carDao.loadAll();
Toast.makeText(this, cars.toString(), Toast.LENGTH_SHORT).show();
break;
case R.id.but22:
//获取所有teacher
List<Teacher> teachers = teacherDao.loadAll();
Toast.makeText(this,teachers.toString(), Toast.LENGTH_SHORT).show();
break;
14.下面的代码就不用说了吧 在主函数里多填几个Butter的按钮就行了 可以直接把下面代码复制到主布局里面
<Button
android:id="@+id/but17"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入teacher数据"
android:onClick="cc"/>
<Button
android:id="@+id/but18"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取指定teacher1的picture"
android:onClick="cc"/>
<Button
android:id="@+id/but19"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取指定teacher2的car"
android:onClick="cc"/>
<Button
android:id="@+id/but20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取所有picture"
android:onClick="cc"/>
<Button
android:id="@+id/but21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取所有car"
android:onClick="cc"/>
<Button
android:id="@+id/but22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取所有teacher"
android:onClick="cc"/>