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 学习文档:
http://greenrobot.org/greendao/documentation/
GreenDao 更新日志:
http://greenrobot.org/greendao/changelog/
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
关键字。
在属性中使用
@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大功告成!