做Android开发,避免不了要和SQLite打交道,如果不使用任何框架,直接使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等,那么是比较麻烦的!目前市面都出现好多比较好用的ORM数据库框架,例如郭神出的LitePal,OrmLite,GreenDAO等。那么今天就来介绍一下GreenDAO的有关使用。
一、GreenDAO概述。
简单的讲,GreenDAO是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
GreenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。
1.GreenDAO官网,http://greendao-orm.com/。
2.项目地址,https://github.com/greenrobot/greenDAO。
GreenDAO设计的主要目标
(1). 一个精简的库
(2). 性能最大化
(3).内存开销最小化
(4).易于使用的 APIs
(5).对 Android 进行高度优化
3.核心类说明
(1).DaoMaster 保存了数据库对象和管理DAO类的classes,其提供了一些静态方法创建和删除表,内部类OpenHelper和DevOpenHelper 实现了SQLiteOpenHelper并创建数据库的框架。
(2)DaoSession 管理所有可用的DAO对象,可以通过getter方法获得。DaoSession还提供了一些通用的持久性方法比如插入、加载、更新,刷新和删除实体。
(3).EntityDao 数据访问对象,每一个实体类都有对应的greenDAO对象。
(4).Entity 实体类对象。
二、配置GreenDAO框架。
目前GreenDAO已经更新到3.*,新版本的使用方法和GreenDAO2.*有所不同,本文基于的是GreenDAO2.*,需要大家注意!
1.如果你使用的Android Studio,那么配置使用GreenDAO很简单,只需要在Gradle文件中加入依赖,
compile "de.greenrobot:greendao:*"
就可以了!Gradle会帮你远程下载这个GreenDAO框架。
2.如果你使用的还是Eclipse,那么就需要下载jar,导入到项目即可使用,你可以在http://search.maven.org中搜索以下三个jar下载,
greendao-generator.jar,freemarker.jar,greendao.jar
三、创建Java工程,生成DAO 文件。
如果你使用的还是Eclipse需要创建一个Java工程,该工程主要用来生成生成数据库表对应的java实体和处理业务的dao层代码。需要导入包greendao-generator.jar和freemarker.jar。下面,是使用Android Studio实现的。
前提
打开Android Studio,新建一个Project,在module中‘src/main’目录下,新建一个目录,名称为‘java-gen’,
然后需要在该module的build.gradle中,加入如下代码,
android {
...
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/java-gen']
}
}
...
}
dependencies {
...
compile 'de.greenrobot:greendao:2.1.0'
}
1. 新建一个Java工程。在Project右键,“NEW-Module”,然后在页面中选择‘java Library’,
2.在该java工程的build.gradle中,需要引入依赖,
compile 'de.greenrobot:greendao-generator:2.1.0'3. 新建一个类 ExampleDaoGenerator,具体代码如下,
public static void main(String[] args) throws Exception {说明,
//第一个参数是数据库版本号,第二个参数是包的根目录的包
int version=1;
String defaultPackage="cn.xinxing.model";
Schema schema = new Schema(version, defaultPackage);
//指定自动生成的dao对象的包名,不指定则都DAO类生成在defaultPackage包中
schema.setDefaultJavaPackageDao("cn.xinxing.dao");
//添加实体
addEntity(schema);
addNote(schema);
try {
//第二个参数是src-gen文件夹路径
String outDir="E:/as_workspace/test/greendaotest/src/main/java-gen";
new DaoGenerator().generateAll(schema,outDir);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void addEntity(Schema schema) {
//一个实体(类)就关联到数据库中的一张表
Entity entity = schema.addEntity("Student");
//指定表名,如不指定,表名则为 Entity(即实体类名)
entity.setTableName("student");
//给实体类中添加属性(即给表中添加字段)
entity.addIdProperty().autoincrement();//添加Id,自增长
entity.addStringProperty("name").notNull();//添加String类型的name,不能为空
entity.addIntProperty("age");//添加Int类型的age
entity.addDoubleProperty("score");//添加Double的score
}
private static void addNote(Schema schema) {
// 一个实体(类)就关联到数据库中的一张表,此处表名为「Note」(既类名)
Entity note = schema.addEntity("Note");
// 指定表名,如不指定,表名则为实体类名
note.setTableName("note");
// greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
//给实体类中添加属性(即给表中添加字段)
note.addIdProperty().autoincrement();//添加Id,自增长
note.addStringProperty("text").notNull();//不能为空
note.addStringProperty("comment");
note.addDateProperty("date");
}
(1).创建模型或者说创建表 需要用到Schema类(数据库对象的集合),
// 第一个参数是数据库版本号,第二个参数是根目录的包路径(2).指定自动生成的dao对象的包名,不指定则都DAO类生成在defaultPackage包中
int version=1;
String defaultPackage="cn.xinxing.model";
Schema schema = new Schema(version, defaultPackage);
schema.setDefaultJavaPackageDao("cn.xinxing.dao");(3).添加实体(通过实体类创建出表以及字段)
private static void addEntity(Schema schema) {
//一个实体(类)就关联到数据库中的一张表
Entity entity = schema.addEntity("Student");
//指定表名,如不指定,表名则为 Entity(即实体类名)
entity.setTableName("student");
//给实体类中添加属性(即给表中添加字段)
entity.addIdProperty().autoincrement();//添加Id,自增长
entity.addStringProperty("name").notNull();//添加String类型的name,不能为空
entity.addIntProperty("age");//添加Int类型的age
entity.addDoubleProperty("score");//添加Double的score
}
(4). 生成DAO,
String outDir="E:/as_workspace/test/greendaotest/src/main/java-gen";写完以上代码后,运行该java工程,在控制台如果输入如下信息,说明成功了,如果出错,请按照错误提示处理。
new DaoGenerator().generateAll(schema,outDir); //第二个参数是src-gen文件夹相对路径
然后我们打开java-gen目录,便会看到
至此,生成DAO已经完成了,下面就看如何使用这些文件,
四、使用。
为了管理以及使用方便,我们创建一个DbHelper 类,通过它来管理有关数据库操作。
DbHelper 的具体实现如下,
public class DbHelper {
private static DbHelper instance;
private DaoMaster.DevOpenHelper helper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private StudentDao mStunentDao;
public static synchronized DbHelper getInstance(Context context) {
if (instance == null)
instance = new DbHelper(context);
return instance;
}
private DbHelper(Context context) {
helper = new DaoMaster.DevOpenHelper(context, "xinxing-db", null);
db = helper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
mStunentDao = mDaoSession.getStudentDao();
mStunentDao.getDatabase();
}
/**
* 向student表中插入一条数据
*
* @param student
*/
public void insertStudent(Student student) {
mStunentDao.insert(student);
}
/**
* 向student表中插入多条数据
*
* @param list
*/
public void insertStudent(List<Student> list) {
for (Student s : list) {
mStunentDao.insert(s);
}
}
/**
* 获取所有的student表中数据
*
* @return
*/
public List<Student> getAllStudents() {
return mStunentDao.loadAll();
}
public void closeDb() {
if (db.isOpen())
db.close();
}
}
上面是简单操作数据库的方法,下面在Activity中编写测试代码,
public class MainActivity extends AppCompatActivity {下面是运行后点击多次按钮的效果截图,
Button btn;
TextView tv;
Student mStudent;
StringBuffer stringBuffer;
int i = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DbHelper.getInstance(MainActivity.this).deleteAllStudent();
stringBuffer = new StringBuffer();
btn = (Button) findViewById(R.id.addData);
tv = (TextView) findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
i++;
stringBuffer.setLength(0);
mStudent=new Student();
mStudent.setName("job" + i);
mStudent.setAge(i);
mStudent.setScore(100d-i);
DbHelper.getInstance(MainActivity.this).insertStudent(mStudent);
List<Student> list = DbHelper.getInstance(MainActivity.this).getAllStudents();
for (Student s : list) {
stringBuffer.append(s.getName() + s.getAge() + s.getScore()+"\n");
}
tv.setText(stringBuffer.toString());
}
});
}
}
下面是数据库中的student表数据截图,
至此,使用GreenDAO创建数据库以及表,插入数据,显示数据都已经成功了!是不是很简单呢!下篇文章讲解使用GreenDAO来做一些复杂的查询操作以及更新!详情请看 Android ORM 框架之 GreenDAO(二) 进阶。