一、为什么要对比数据库不同的orm工具库
最近在寻找Android开发中好用的ORM框架,以用于集成到目前的项目中,首要考虑的是内存占有量小,性能高,编译时间短,这样需求定下来,就基本定位到几个github上star数和fork数都排名靠前的几位大神撰写的数据库框架,接下来,会根据每个数据库框架来详细解析。
二、有哪些好用的数据库框架
首先,在这里要澄清一个理念,好用不好用,真的是因项目而异,不能觉得很火很强大,就立马去拿来用,也不知道自己的项目里需不需要,或者还有可能多种框架其实功能是差不多的,这里安利一个简书上的作者写的关于选择开源框架的文章。这么多开源框架,该用哪个好?
言归正传,在这里,我们要继续探讨关于数据库框架的选择,上面说了,已经选定了几个数据库框架,如下:
- GreenDao
- OrmLite
- Realm
- ActiveAndroid
三、解析数据库框架的妙用
一、GreenDao基本简介
Android Sqlite orm 的 db 工具类
项目地址:https://github.com/greenrobot/greenDAO
文档介绍:http://greendao-orm.com/documentation/
特点:
(1) 性能佳
(2) 简单易用的 API
(3) 内存:小
(4) 库大小:小
目前为止,到我正式接触到的GreenDao已经更新到了3.0以后,很多人不包括我,是从2014年接触GreenDao至今,项目中会一直使用GreenDao框架处理数据库操作。在平时的开发过程中,大家一定会或多或少地接触到SQLite,在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等,现在能用到像greenDAO这种集成好的框架,简直是太幸福了。
GreenDao 介绍:
greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:
虽然现在更新到了3.0以后,不过我下面要讲的是针对老版本的2.0.0。
(一)GreenDao的使用与配置
1.在新建的一个Project中,src/main中创建一个与java同级的java-gen目录
2.配置Project中的app的build.gradle
sourceSets {
main{
java.srcDirs= ['src/main/java','src/main/java-gen']
}
}
compile 'de.greenrobot:greendao:2.0.0'
3.为Project中新建一个Java Library项目
通过 File -> New -> New Module -> Java Library -> 填写相应的包名与类名 -> Finish
需要为该Java项目添加依赖,注意,在Java项目中添加的是greendao-generator依赖,这与上面的不同,因为这个Java项目就是负责生成相应的实体和DAO的,如下:
compile 'de.greenrobot:greendao-generator:2.0.0'
注意: 我们的 Java 工程只有一个类,它的内容决定了「GreenDao Generator」的输出,你可以在这个类中通过对象、关系等创建数据库结构,下面我将以注释的形式详细讲解代码内容。
public class ExampleDapGenerator {
public static void main(String[] args) throws Exception{
//创建一个用于添加实体的Schema对象,第一个参数表示数据库的版本,第二个参数表示在java-gen目录下自动生成的实体类和DAO类存放的包名
Schema schema = new Schema(1,"com.sun.greendao");
// schema.setDefaultJavaPackageDao("com.sun.dao");//假如你不想实体类和DAO类都放在一个包中,你可以重新为DAO类设置一个新的包
//创建一个实体,一个实体对应一张表,此处表示生成的实体名为Student,同样它默认也是表名
Entity entity = schema.addEntity("Student");
// entity.setTableName("Students");//你如果不想实体名和表名相同,也可以重新设置一个表名
//为Student表添加字段,这里的参数表示实体类Student的字段名,生成的表中的字段会变成大写,如name在表中字段为NAME
entity.addIdProperty().autoincrement().primaryKey();
entity.addStringProperty("name").notNull();
entity.addIntProperty("age");
entity.addBooleanProperty("is_man");
//最后通过DaoGenerator对象的generateAll()方法来生成相应的实体类和DAO类,参数分别为Schema对象和java-gen目录路径
new DaoGenerator().generateAll(schema,"../TestGreenDao/app/src/main/java-gen");
}
}
执行 generator 工程,如一切正常,你将会在控制台看到如下日志,并且在主工程「java-gen」下会发现生成了四个类:
4.在android 工程中进行数据库操作
public class MainActivity extends AppCompatActivity {
private DaoMaster.DevOpenHelper helper;
private DaoMaster master;
private DaoSession session;
private StudentDao dao;
private EditText mEditText;
private ListView mListView;
private SimpleCursorAdapter adapter;
private Cursor cursor;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.edt_content);
mListView = (ListView) findViewById(R.id.listview);
//第一个参数为Context,第二个参数为数据表的文件名,这个我们可以以"表名+s+'-db'"来命名,第三个通常为null
helper = new DaoMaster.DevOpenHelper(this, "students-db", null);
db = helper.getWritableDatabase();
master = new DaoMaster(db);
session = master.newSession();
//得到StudentDAO对象,所以在这看来,对于这三个DAO文件,我们更能接触到的是StudentDao文件,进行CRUD操作也是通过StudentDao对象来操作
dao = session.getStudentDao();
//遍历表中的所有数据
cursor = db.query(dao.getTablename(), dao.getAllColumns(), null, null, null, null, null);
//通过StudentDao的静态内部类得到Name字段对应表中的列名
String[] from = {StudentDao.Properties.Name.columnName, StudentDao.Properties.Age.columnName};
int[] to = {android.R.id.text1, android.R.id.text2};
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from, to, SimpleCursorAdapter.NO_SELECTION);
mListView.setAdapter(adapter);
}
public void click(View view) {
switch (view.getId()) {
case R.id.btn_add:
add();
Cursor cursor = db.query(dao.getTablename(), dao.getAllColumns(), null, null, null, null, null);
adapter.swapCursor(cursor);//交换cursor数据集从而实时更新UI
//cursor.requery();//这个也可以实时更新UI,不过官方已经不推荐使用了,因为它可能会阻塞UI线程造成ANR
break;
case R.id.btn_delete:
delete();
Cursor cursor2 = db.query(dao.getTablename(), dao.getAllColumns(), null, null, null, null, null);
adapter.swapCursor(cursor2);
break;
case R.id.btn_update:
update();
Cursor cursor3 = db.query(dao.getTablename(), dao.getAllColumns(), null, null, null, null, null);
adapter.swapCursor(cursor3);
break;
case R.id.btn_search:
search();
break;
}
}
private void add() {
String content = mEditText.getText().toString().trim();
//DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, Locale.CHINA);
Student student = new Student(null, content, 18, true);//由于主键id之前设置了自增长,所以传入null即可
dao.insert(student);//插入数据
}
private void delete() {
String content = mEditText.getText().toString().trim();
dao.deleteByKey(Long.valueOf(content));//通过主键来删除某行数据
//dao.deleteAll();//全部删除
}
private void update() {
String content = mEditText.getText().toString().trim();
//update只能通过主键来更新某个实体对应的数据,这里的主键为id
dao.update(new Student(Long.valueOf(content), "这是修改的", 120, true));
}
private void search() {
String content = mEditText.getText().toString().trim();
//通过queryBuilder()来查询可以更方便的设置查询的条件,其中eq()方法表示equal(),判断Name是否和content相等,然后通过build建立查询
Query<Student> query = dao.queryBuilder().where(StudentDao.Properties.Name.eq(content)).build();
List<Student> list = query.list();
//下面两个Flag的设置可以在控制台中打印出此次查询的sql语句和value值
QueryBuilder.LOG_SQL = true;
QueryBuilder.LOG_VALUES = true;
new AlertDialog.Builder(this).setMessage(list.get(0).getName() + "," + list.get(0).getAge()).setPositiveButton("确定", null).create().show();
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/edt_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="click"
android:text="添加" />
<Button
android:id="@+id/btn_delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="click"
android:text="删除" />
<Button
android:id="@+id/btn_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="click"
android:text="修改" />
<Button
android:id="@+id/btn_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="click"
android:text="查询" />
</LinearLayout>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
以上就是关于GreenDAO的简单用法,接下来会继续介绍其他数据库的用法及特点。