文章背景
程序猿或是程序媛们在开发Android项目的时候,在使用原始方法来操作SQLite数据库实现数据本地持久化时,往往要编写大量的sql语句来实现数据库的各种操作,这对程序员的技术要求较高,同时在一定程度上影响开发效率,那么我们可以使用目前市面上比较流行的第三方数据库操作库greenDao。但本人还是强烈建议先学习SQLite原始操作方法,万变不理其中,这样再学习greenDao就会变得更轻松,更深刻些,可以参考:http://blog.csdn.net/xinanheishao/article/details/73436291
文章目标
greenDao实现数据库建库建表
greenDao实现增删改查操作
提供一个数据库操作工具给大伙。
greenDao简单介绍
greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案,所谓ORM可以简单理解为框架可以把数据库的表自动转化为实体模型,程序员只要操作实体即可,操作实体即操作对应的表,这种框架设计是目前比较流行也是软件开发的趋势。
greenDao是一个精简的库
greenDao和同类型的库相比,性能是最好的,不过数据量不大的情况下,也看不出性能优势
greenDao内存开销最小化
greenDao易于使用的 APIs
导入greenDao3.0库
dependencies { compile 'org.greenrobot:greendao:3.0.1' compile 'org.greenrobot:greendao-generator:3.0.0' }
gradle中的greenDao相关配置
在gradle的中配置完毕之后,sync project一下,gradle会自动去远程仓库下载一个gradle的插件,专为greenDAO服务的,用来生成数据库相关的代码。
apply plugin: 'org.greenrobot.greendao'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
greenDao生成配置
配置说明:
schemaVersion—->指定数据库schema版本号,迁移等操作会用到
daoPackage——–>通过gradle插件生成的数据库相关文件的包名,默认为你 的entity所在的包名
targetGenDir——–>这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了
greendao { schemaVersion 1 daoPackage 'com.example.yangdechengapplication.greendao' targetGenDir 'src/main/java' }
实体类的生成
package com.example.yangdechengapplication.entity;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Transient;
import org.greenrobot.greendao.annotation.Generated;
/** * Created by Administrator on 2017/6/25. */
@Entity
public class User {
@Id
private Long id;
private String userNo;
private String name;
@Transient
private int tempUsageCount; // not persisted
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserNo() {
return this.userNo;
}
public void setUserNo(String userNo) {
this.userNo = userNo;
}
@Generated(hash = 1192512955)
public User(Long id, String userNo, String name) {
this.id = id;
this.userNo = userNo;
this.name = name;
}
@Generated(hash = 586692638)
public User() {
}
}
实体类中常用的注解:
@Entity 表明这个实体类会在数据库中生成一个与之相对应的表。
@Id 对应数据表中的 Id 字段,有了解数据库的话,是一条数据的唯一标识。
@Property(nameInDb = “STUDENTNUM”) 表名这个属性对应数据表中的 STUDENTNUM 字段。
@Property 可以自定义字段名,注意外键不能使用该属性
@NotNull 该属性值不能为空
@Transient 该属性不会被存入数据库中
@Unique 表名该属性在数据库中只能有唯一值
当你编写完实体之后,点击编译根据实体类会在greenDao配置的目录下生成三个数据库数据库相关的类:DaoSession、DaoMaster以及所有实体类的dao类,其中DaoMaster 和 DaoSession 这两个类用于初始化数据库,UserDao就是操作User表的类。
如图所示:
GreenDaoHelper
这是我封装的数据库库初始化的帮助类
package com.example.yangdechengapplication.data;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.example.yangdechengapplication.MyApplication;
import com.example.yangdechengapplication.greendao.DaoMaster;
import com.example.yangdechengapplication.greendao.DaoSession;
/** * Created by Administrator on 2017/6/25. */
public class GreenDaoHelper {
private static DaoMaster.DevOpenHelper mHelper;
private static SQLiteDatabase db;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;
private static GreenDaoHelper instance = new GreenDaoHelper();
public static GreenDaoHelper getInstance(){
return instance;
}
/** * 初始化greenDao,这个操作建议在Application初始化的时候添加; */
public static void initGreenDao(Context context) {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(context, "mygreendb", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public static DaoSession getDaoSession() {
return mDaoSession;
}
public static SQLiteDatabase getDb() {
return db;
}
}
然后再程序的入口初始化数据库
package com.example.yangdechengapplication;
import android.app.Application;
import com.example.yangdechengapplication.data.BaseDBHelper;
import com.example.yangdechengapplication.data.GreenDaoHelper;
import com.example.yangdechengapplication.tools.CrashHandler;
import com.example.yangdechengapplication.tools.LogToFile;
/** * Created by Administrator on 2017/6/15. */
public class MyApplication extends Application {
private final static float HEAP_UTILIZATION = 0.75f;
private final static int MIN_HEAP_SIZE = 6* 1024* 1024 ;
@Override
public void onCreate() {
super.onCreate();
// 异常处理,不需要处理时注释掉这两句即可!
CrashHandler crashHandler = CrashHandler.getInstance();
// 注册crashHandler
crashHandler.init(getApplicationContext());
LogToFile.init(getApplicationContext());
//ydc 20170616 初始化数据库
BaseDBHelper.getInstance().init(getApplicationContext());
//ydc 20170629 初始化greenDao数据库
GreenDaoHelper.initGreenDao(getApplicationContext());
}
}
查看数据库
如果是模拟器运行的话,Android系统底层是Linux构建的,所以我们可以使用adb shell命令来查看我们所创建的数据库,步骤如下:
adb shell
su
ls -l
cd data
ls -l
cd data
ls -l
cd 你的包名
ls -l
cd databases
ls -l
还可以进一步操作:
在 # 提示符下输入以下命令,我们进入sqlite(Figure3)。
sqlite3 mygreendb.db
这个命令会打开mygreendb.db数据库,若mygreendb.db数据库不存在,则会新建一个名为
mygreendb.db的数据库。(注意数据库名大小写有区别)
在sqlite>提示符下输入
.help 这个命令让我们看到许多命令
.tables 查看所有表,例如我的系统里有USER表
数据库增删改查操作
在Activity中获取UserDao实例
UserDao userDao= GreenDaoHelper.getDaoSession().getUserDao();
增加操作
User user = new User(null,String.valueOf(userNo), "张三");
userDao.insert(user);
删除操作
userDao.deleteAll();
修改操作
先根据编号获取的想修改的User实体,再做修改
User user=getUserByNo(String.valueOf(2));
user.setName("李四");
userDao.update(user);
private User getUserByNo(String userNo){
user=userDao.queryBuilder().where(UserDao.Properties.UserNo.eq(userNo)).unique();
return user;
}
查询操作
List userList = userDao.queryBuilder()
.where(UserDao.Properties.Id.notEq(999))
.orderAsc(UserDao.Properties.Id)
.limit(5)
.build().list();
GreendaoActivity
greenDao增删改查操作所在类Activity
package com.example.yangdechengapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.yangdechengapplication.data.DBHelperService;
import com.example.yangdechengapplication.data.GreenDaoHelper;
import com.example.yangdechengapplication.entity.User;
import com.example.yangdechengapplication.greendao.UserDao;
import java.util.List;
/** * Created by ydc on 2017/6/25. */
public class GreendaoActivity extends AppCompatActivity {
private Button delete;
private Button insertButton;
private Button updateButton;
private Button queryButton;
private TextView tv_info;
private UserDao userDao;
private User user;
private int userNo=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_greendao);
userDao= GreenDaoHelper.getDaoSession().getUserDao();
delete = (Button)findViewById(R.id.delete);
updateButton = (Button)findViewById(R.id.update);
insertButton = (Button)findViewById(R.id.insert);
queryButton = (Button)findViewById(R.id.query);
tv_info=(TextView)findViewById(R.id.tv_info);
delete.setOnClickListener(new DeleteListener());
updateButton.setOnClickListener(new UpdateListener());
insertButton.setOnClickListener(new InsertListener());
queryButton.setOnClickListener(new QueryListener());
}
class InsertListener implements View.OnClickListener {
@Override
public void onClick(View v) {
userNo++;
user = new User(null,String.valueOf(userNo), "张三");
userDao.insert(user);
}
}
class UpdateListener implements View.OnClickListener {
@Override
public void onClick(View arg0) {
user=getUserByNo(String.valueOf(userNo));
user.setName("李四");
userDao.update(user);
}
}
class QueryListener implements View.OnClickListener {
@Override
public void onClick(View v) {
String names="";
List userList = userDao.queryBuilder()
.where(UserDao.Properties.Id.notEq(999))
.orderAsc(UserDao.Properties.Id)
.limit(5)
.build().list();
for (User u: userList
) {
names+="姓名:"+u.getName()+" 学号:"+u.getUserNo()+";\n";
}
tv_info.setText(names);
}
}
class DeleteListener implements View.OnClickListener {
@Override
public void onClick(View v) {
userDao.deleteAll();
}
}
private User getUserByNo(String userNo){
user=userDao.queryBuilder().where(UserDao.Properties.UserNo.eq(userNo)).unique();
return user;
}
}
Dome下载地址:http://download.csdn.net/download/xinanheishao/9880447