关于Android数据库orm工具库对比的几点思考(一)
2016-10-08 10:43
381 查看
一、为什么要对比数据库不同的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/
官网网址: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目录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的简单用法,接下来会继续介绍其他数据库的用法及特点。
相关文章推荐
- 关于Android数据库orm工具库对比的几点思考(二)
- 关于Android数据库orm工具库对比的几点思考(三)
- 关于Android数据库orm工具库对比的几点思考(四)
- Android 关于ormlite数据库框架解析(二)
- 关于微软停止移植 Android 应用的几点思考
- 关于数据库查询业务的几点思考
- 关于数据库查询业务的几点思考
- Android数据库工具ORM-greenDAO学习
- 关于android sqlite数据库使用的几点心得
- Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库
- Android ORM数据库框架对比
- 关于Android 数据库使用的几点心得
- Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库
- 关于Java的ORM及 PHP直接面向数据库关系 模式的思考
- Android Sqlite数据库执行插入查询更新删除的操作对比
- 关于《微积分阅览室》的几点思考
- Android 关于Service的几点理解
- 关于androidUI设计的几点建议
- 关于软件开发人员评价的几点思考
- Android记录5--关于Android云测试的小思考