GreenDao的简单用法

GreenDao简单使用

关于GreenDao

greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。
关于greenDAO的概念可以看官网greenDAO

greenDAO 优势

1、一个精简的库
2、性能最大化
3、内存开销最小化
4、易于使用的 APIs
5、对 Android 进行高度优化

官方资料地址
首先为大家附上官方地址,方便英文水准好的直接查阅,如下:
GreenDao 官网: http://greenrobot.org/greendao/
GreenDao 特征介绍: http://greenrobot.org/greendao/features/
GreenDao GitHub地址: https://github.com/greenrobot/greenDAO

GreenDao 对外提供核心类简介
下面为大家附上一张图,大家可以仔细查看后,在仔细往下看,有助于理解~
这里写图片描述
1.DaoMaster:
       使用GreenDao的切入点(开始)。
       DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类(而不是对象)。它具有静态方法来创建表或将它们删除。其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。
2.DaoSession:
       管理特定模式的所有可用Dao对象,您可以使用其中一个getter方法获取。DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。最后,DaoSession对象也跟踪一个身份范围。有关更多详细信息, 请点击查看会话文档
3.Dao层:
       数据访问对象(Dao)持续存在并查询实体。对于每个实体,GreenDao生成一个Dao,它比DaoSession有更多的持久化方法,例如:count,loadAll和insertInTx。
4.实体:
       持久对象 通常实体是使用标准Java属性(如POJO或JavaBean)来表示数据库行的对象
@Id 注释选择   /  属性作为实体ID。在数据库方面,它是主要的关键。参数 autoincrement   是一个标志,使ID值不断增加(不重用旧值)。
@Property 允许您定义属性映射到的非默认列名称。如果缺少,greenDAO将以SQL-ish方式使用字段名称(大写字母,下划线而不是骆驼案例,例如  customName 将成为  CUSTOM_NAME )。注意:您当前只能使用内联常量来指定列名。
@NotNull 使该属性在数据库端成为“NOT NULL”列。通常使用@NotNull标记原始类型(long,int,short,byte)是有意义的,而具有包装类(Long,Integer,Short,Byte))的可空值。
@Transient 标记要从持久性中排除的属性。使用这些临时状态等。或者,您也可以使用Java中的 transient 关键字。
实体必须具有  long 或  Long 属性作为其主键。这是 Android SQLite的 推荐做法
在属性中使用 @Index 为相应的数据库列创建数据库索引。使用以下参数自定义:
  • 名称:如果您不喜欢greenDAO为索引生成的默认名称,则可以在此处指定。
  • 唯一:向索引添加UNIQUE约束,强制所有值都是唯一的。

使用步骤:

  • 1 配置gradle相关
Project的build.gradle下:缺什么补什么不知道怎么加的自己琢磨.
buildscript {
   	 repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
实体类存在的Module的build.gradle下:
apply plugin: 'org.greenrobot.greendao'// 添加应用依赖插件

android {
    /*针对greenDao的一些配置*/
    greendao {
        schemaVersion 1 //数据库版本号
        daoPackage 'com.usher.greendao_demo.greendao.gen' //自动生成的工具类的包名
        targetGenDir 'src/main/java' //路径
    }
}
dependencies {
   。。。。其他依赖
    /*greenDao框架*/
    compile 'org.greenrobot:greendao:3.2.0'
}


 
     
先写实体类User
/**
 * 实体必须具有 long或 Long属性作为其主键。这是Android和SQLite的推荐做法
 */
@Entity
public class Student {
    @Id(autoincrement = true)//id自增长
    private  long  id;
    @Generated
    private String name;

    @Generated(hash = 1314737876)
    public Student(long id, String name) {
        this.id = id;
        this.name = name;
    }

    @Generated(hash = 1556870573)
    public Student() {
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

greenDao多使用注解,如果你要将某一实体存储到数据库中,需要先对实体进行编写。
@Entity表明该类是持久化的类【持久化含义,存入数据库文件中,作本地化处理】
@Id选择一个long或Long类型的属性作为该实体所对应数据库中数据表的主键【类型要是long】
@Generated写在构造方法前
将以上注解写好后,点击AS上的Make Project即可
然后可以发现,你的Module中多了个包
然后接下来就可以对数据库进行操作了
先上布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="hc.com.green.MainActivity">

    <EditText
        android:id="@+id/etid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入ID"
        android:numeric="integer" />

    <EditText
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容"
         />

    <Button
        android:id="@+id/insert"
        android:text="添加"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/queary"
        android:text="查询"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/delite"
        android:text="删除"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/updata"
        android:text="修改"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>



然后是MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText etID;
    private EditText etName;
    private TextView tvtext;
    private StudentDao studentDao;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();//初始化数据
        initDbHelp();
    }

    private void initDbHelp() {
        //创建数据库
        DaoMaster.DevOpenHelper Helper = new DaoMaster.DevOpenHelper(MainActivity.this, "student.db", null);
        SQLiteDatabase db = Helper.getWritableDatabase();
        DaoMaster daoMaster = new DaoMaster(db);
        DaoSession daoSession = daoMaster.newSession();
        studentDao = daoSession.getStudentDao();

    }

    //初始化数据
    private void initView() {
        etID = (EditText) findViewById(R.id.etid);
        etName = (EditText) findViewById(R.id.content);
        tvtext = (TextView) findViewById(R.id.text);
        findViewById(R.id.insert).setOnClickListener(this);
        findViewById(R.id.queary).setOnClickListener(this);
        findViewById(R.id.delite).setOnClickListener(this);
        findViewById(R.id.updata).setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.insert://插入数据
                String id = etID.getText().toString();
                String name = etName.getText().toString();
                if (isNotEmpty(id) && isNotEmpty(name)) {
                    QueryBuilder qb = studentDao.queryBuilder();
                    List<Student> list = qb.where(StudentDao.Properties.Id.eq(id)).list();
                    if (list.size() > 0) {
                        Toast.makeText(MainActivity.this, "主键重复", Toast.LENGTH_SHORT).show();
                    } else {
                        studentDao.insert(new Student(Long.valueOf(id), name));
                        Toast.makeText(MainActivity.this, "插入数据成功", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (isEmpty(id) && isNotEmpty(name)) {
                        Toast.makeText(MainActivity.this, "id为空", Toast.LENGTH_SHORT).show();
                    }
                    if (isEmpty(name) && isNotEmpty(id)) {
                        Toast.makeText(MainActivity.this, "姓名为空", Toast.LENGTH_SHORT).show();
                    }
                    if (isEmpty(id) && isEmpty(name)) {
                        Toast.makeText(MainActivity.this, "请填写信息", Toast.LENGTH_SHORT).show();
                    }
                    etID.setText("");
                    etName.setText("");
                }
                break;
            case R.id.delite://删除数据
                id = etID.getText().toString();
                if (isNotEmpty(id)) {
                    studentDao.deleteByKey(Long.valueOf(id));
                    QueryBuilder qb = studentDao.queryBuilder();
                    ArrayList<Student> list = (ArrayList<Student>) qb.where(StudentDao.Properties.Id.eq(id)).list();
                    if (list.size() < 1) {
                        Toast.makeText(MainActivity.this, "删除数据成功", Toast.LENGTH_SHORT).show();
                        etID.setText("");
                        etName.setText("");
                    }
                } else {
                    Toast.makeText(MainActivity.this, "id为空", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.updata:
                id = etID.getText().toString();
                name = etName.getText().toString();
                if (isNotEmpty(id) && isNotEmpty(name)) {
                    QueryBuilder qb = studentDao.queryBuilder();
                    List<Student> list = qb.where(StudentDao.Properties.Id.eq(id)).list();
                    if (list.size() > 0) {
                        studentDao.update(new Student(Long.valueOf(id), name));
                        Toast.makeText(MainActivity.this, "修改成功", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (isEmpty(id) && isNotEmpty(name)) {
                        Toast.makeText(MainActivity.this, "id为空", Toast.LENGTH_SHORT).show();
                    }
                    if (isEmpty(name) && isNotEmpty(id)) {
                        Toast.makeText(MainActivity.this, "姓名为空", Toast.LENGTH_SHORT).show();
                    }
                    if (isEmpty(id) && isEmpty(name)) {
                        Toast.makeText(MainActivity.this, "请填写信息", Toast.LENGTH_SHORT).show();
                    }
                    etID.setText("");
                    etName.setText("");
                }
                break;
            case R.id.queary://查询数据
                id = etID.getText().toString();
                if (isNotEmpty(id)) {
                    QueryBuilder qb = studentDao.queryBuilder();
                    ArrayList<Student> list = (ArrayList<Student>) qb.where(StudentDao.Properties.Id.eq(id)).list();
                    if (list.size() > 0) {
                        String text = "";
                        for (Student user : list) {
                            text = text + "\r\n" + user.getName();
                        }
                        tvtext.setText(text);
                    } else {
                        tvtext.setText("");
                        Toast.makeText(MainActivity.this, "不存在该数据", Toast.LENGTH_SHORT).show();
                    }
                    etID.setText("");
                    etName.setText("");
                } else {
                    Toast.makeText(MainActivity.this, "id为空", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                break;
        }
    }

    //判断输入框输入ID和用户名不能为空
    private boolean isNotEmpty(String s) {
        if (s != null && !s.equals("") || s.length() > 0) {
            return true;
        } else {
            return false;
        }
    }

    private boolean isEmpty(String s) {
        if (isNotEmpty(s)) {
            return false;
        } else {
            return true;
        }
    }
}

以上有一些判断是否成功的操作,因为greenDao并没有提供操作后的回调,所以我这里就只是手动判断一下
依次存入1/usher 、2/tom、3/harry 三组数据,然后提取数据库文件如下:
OK大功告成!









猜你喜欢

转载自blog.csdn.net/yushuaiguang/article/details/77983652