简介:
Greendao是一个开源的Android ORM(对象-关系映射)开发框架,它使SQLite数据库的操作变得更简单、更容易理解。它减轻开发人员处理低级别的数据库需求,同时节省开发时间。 SQLite是一个很好的嵌入式关系数据库。尽管如此,写SQL和解析查询结果是相当繁琐和耗时的任务。Greendao使你远离这些java对象映射到数据库表(称为ORM,对象-关系映射”)。这样你可以存储,更新,删除,并使用一个简单的面向对象的API来操作数据库。
使用方法:
第一步:在整个项目工程的build.gradle文件中添加依赖,如下中红色标记的部分。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
classpath'org.greenrobot:greendao-gradle-plugin:3.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
第二步:在GreenDao下的build.gradle中添加配置,如下红色标记的部分:
apply plugin:'com.android.application'
apply plugin:'org.greenrobot.greendao'
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.example.greendao"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
}
}
greendao{
schemaVersion 1
targetGenDir 'src/main/java'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
compile'org.greenrobot:greendao:3.2.0'
}
第三步:在项目包下创建实体类User:
package com.example.greendao;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Property;
/**
* @Entity表示这个实体类会在数据库中生成对应的表,
*/
@Entity
public class User {
//@Id表示该字段是id,该字段的数据类型为 Long
@Id
privateLongid;
//@Property则表示该属性将作为表的一个字段,其中nameInDb看名字就知道这个属性在数据库中对应的数据名称。
@Property(nameInDb ="USERNAME")
private String username;
@Property(nameInDb = "PWD")
private String pwd;
}
第四步:编译运行项目,编译运行成功之后系统会帮助我们在User类里生成相应的构造方法和get/set方法,并且还会在我们的包下生成DaoMaster和DaoSession。如下:
那么这些类如何使用呢?下面我们就用这些类对SQlite数据库进行增删改查的操作。
首先,我们在布局文件activity_main.xml中添加一些增删改成的按钮:
xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"
android:layout_width="match_parent"android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.greendao.MainActivity">
<Button
android:id="@+id/create_sq"
android:text="创建数据库"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/add_sq"
android:text="增加数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/del_sq"
android:text="删除一条数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/delall_sq"
android:text="删除全部数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/modify_sq"
android:text="修改数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/query_one_sq"
android:text="查询某条数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/query_all_sq"
android:text="查询全部数据"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
LinearLayout>
然后,我们在MainActivity中实现这些按钮的点击事件,具体实现请参考如下代码,相应操作都有代码注释:
package com.example.greendao;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import org.greenrobot.greendao.query.QueryBuilder;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
/**
* 数据库的名字
*/
private finalStringDBName= "greendao_test.db";
//Button的成员变量
privateButtoncreatBtn;
private Button addBtn;
private Button delBtn;
private Button delAllBtn;
private Button modifyBtn;
private Button queryBtn;
private Button queryAllBtn;
//操作user表的成员变量
UserDao userDao = null;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
creatBtn = (Button) findViewById(R.id.create_sq);
addBtn = (Button) findViewById(R.id.add_sq);
delBtn = (Button) findViewById(R.id.del_sq);
delAllBtn = (Button) findViewById(R.id.delall_sq);
modifyBtn = (Button) findViewById(R.id.modify_sq);
queryBtn = (Button) findViewById(R.id.query_one_sq);
queryAllBtn = (Button) findViewById(R.id.query_all_sq);
creatBtn.setOnClickListener(this);
addBtn.setOnClickListener(this);
delBtn.setOnClickListener(this);
delAllBtn.setOnClickListener(this);
modifyBtn.setOnClickListener(this);
queryBtn.setOnClickListener(this);
queryAllBtn.setOnClickListener(this);
}
@Override
public voidonClick(View v) {
switch (v.getId()) {
//点击创建数据库的操作,如果已经创建过则默认不再创建 只是打开数据库 并获取操作user表的session
caseR.id.create_sq:
//获取DaoMaster对象
DaoMaster.DevOpenHelper devOpenHelper =newDaoMaster.DevOpenHelper(getApplicationContext(),DBName,null);
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDb());
//获取DaoSession对象
DaoSession daoSession = daoMaster.newSession();
//获取UserDao对象
userDao= daoSession.getUserDao();
Log.i("tag", "create db");
break;
//点击增加数据的操作
caseR.id.add_sq:
//添加一条数据 GreenDao一般默认将id字段作为唯一约束并自动增长 在添加数据时不要添加id相同的数据 否则会报错
User user =newUser();
user.setPwd("123");
user.setUsername("zhangsan");
if (userDao!=null) {
try {
userDao.insert(user);
Log.i("tag","insert data in db");
} catch (Exception e) {
e.printStackTrace();
}
}
break;
//点击删除某条数据的操作
caseR.id.del_sq:
//删除id为1的数据
if(userDao!=null) {
userDao.deleteByKey(1l);
Log.i("tag","delete data in db");
}
break;
//点击删除全部数据的操作
caseR.id.delall_sq:
//删除全部数据
if(userDao!=null) {
userDao.deleteAll();
Log.i("tag","delete all data in db");
}
break;
//点击修改数据的操作
caseR.id.modify_sq:
//修改数据 将密码改为321
User user1 =newUser(1L,"zhangsan","321");
if (userDao!=null) {
userDao.update(user1);
Log.i("tag","update data in db");
}
break;
//点击查询某条数据的操作
caseR.id.query_one_sq:
//查询id为 1 的数据
if(userDao!=null) {
QueryBuilder
queryBuilder.where(UserDao.Properties.Id.eq(1L));
User u = queryBuilder.unique();
if (u != null){
Log.i("tag","id = "+ u.getId() +"\n"+"username = "+ u + "\n"+"pwd = "+ u + "\n");
} else {
Log.i("tag","no this data ");
}
}
break;
//点击查询全部数据的操作
caseR.id.query_all_sq:
//查询全部数据
if(userDao!=null) {
List
if (users != null && users.size() > 0) {
for (inti =0; i < users.size(); i++) {
Log.i("tag","id = "+ users.get(i).getId() +"\n"+"username = "+ users.get(i).getUsername() +"\n"+"pwd = "+ users.get(i).getPwd() +"\n");
}
} else {
Log.i("tag","no data in db");
}
}
break;
}
}
}
运行效果如图:
我们可以点击上面按钮,然后通过日志来查看操作结果,例如我们依次点击创建数据库、增加数据、查询全部数据,查看日志如下:
我们在依次点击增加数据、修改数据、查询全部数据,结果如下:
我们看到成功又添加了一条id = 2的数据并将第一条数据的密码改为了321,读者可通过这种方式继续尝试其他功能。
完毕!