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大功告成!