关于Android数据库orm工具库对比的几点思考(一)

来源:互联网 发布:psv淘宝 编辑:程序博客网 时间:2024/05/23 11:56

一、为什么要对比数据库不同的orm工具库

最近在寻找Android开发中好用的ORM框架,以用于集成到目前的项目中,首要考虑的是内存占有量小,性能高,编译时间短,这样需求定下来,就基本定位到几个github上star数和fork数都排名靠前的几位大神撰写的数据库框架,接下来,会根据每个数据库框架来详细解析。


二、有哪些好用的数据库框架

首先,在这里要澄清一个理念,好用不好用,真的是因项目而异,不能觉得很火很强大,就立马去拿来用,也不知道自己的项目里需不需要,或者还有可能多种框架其实功能是差不多的,这里安利一个简书上的作者写的关于选择开源框架的文章。这么多开源框架,该用哪个好?

言归正传,在这里,我们要继续探讨关于数据库框架的选择,上面说了,已经选定了几个数据库框架,如下:

  1. GreenDao
  2. OrmLite
  3. Realm
  4. ActiveAndroid

三、解析数据库框架的妙用

一、GreenDao基本简介

Android Sqlite orm 的 db 工具类
项目地址:https://github.com/greenrobot/greenDAO

文档介绍:http://greendao-orm.com/documentation/

官网网址:http://greendao-orm.com/

特点:

(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目录

新建文件夹

生成java-gen

2.配置Project中的app的build.gradle

添加sourceSets

添加compile

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 Library

填写包名与类名

需要为该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");    }}

运行java代码

执行 generator 工程,如一切正常,你将会在控制台看到如下日志,并且在主工程「java-gen」下会发现生成了四个类:

实体类和DAO类

app项目中的目录结构

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的简单用法,接下来会继续介绍其他数据库的用法及特点。

0 0
原创粉丝点击