GreenDao数据库

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"/>





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值