Android 操作数据库的框架——greenDAO的学习

greenDAO的使用

简介

官网给出如下介绍:

Android 操作数据库的框架——greenDAO的学习_第1张图片
greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。

Android 操作数据库的框架——greenDAO的学习_第2张图片
在使用greenDAO的时候需要创建两个project,其中一个是java工程,它用来生成特定于您的项目的代码域(即生成了bean对象和操作数据库的dao)

核心的classes

Android 操作数据库的框架——greenDAO的学习_第3张图片

  • DaoMaster:
    DaoMaster保存了数据库对象和管理DAO类的classes,其提供了一些静态方法创建和删除表,内部类OpenHelper和DevOpenHelper 实现了SQLiteOpenHelper并创建数据库的框架。

  • DaoSession:
    管理所有可用的DAO对象,可以通过getter方法获得。DaoSession还提供了一些通用的持久性方法比如插入、加载、更新,刷新和删除实体。

  • DAOs:
    数据访问对象,每一个实体类都有对应的greenDAO对象。

  • Entities:
    实体类对象

核心greenDAO类初始化数据库

helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
noteDao = daoSession.getNoteDao();

主要优点

  • greenDAO 性能远远高于同类的 ORMLite,具体测试结果可见官网
  • greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。
  • 与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,这也是其性能能大幅提升的原因。

使用方法

1.新建Android project并在main目录下新建文件夹java-gen(存放自动生成bean和dao)

2.在build.gradle中配置

//buildTypes{}中配置
sourceSets {
    main {
        java.srcDirs = ['src/main/java', 'src/main/java-gen']
    }
}

//dependencies{}中配置
compile 'de.greenrobot:greendao:2.1.0'

Android 操作数据库的框架——greenDAO的学习_第4张图片

3.新建java project——greenDAO_java

在build.gradle中添加

compile 'de.greenrobot:greendao-generator:2.1.0'

创建模式对象,并添加实体(表)

public class Generator {
    public static void main(String[] args) throws Exception {

        int version=1;
        String defaultPackage="test.greenDAO.bean";
        //创建模式对象,指定版本号和自动生成的bean对象的包名
        Schema schema=new Schema(version,defaultPackage);
        //指定自动生成的dao对象的包名,不指定则都DAO类生成在"test.greenDAO.bean"包中
        schema.setDefaultJavaPackageDao("test.greenDAO.dao");

        //添加实体
        addEntity(schema);

        String outDir="D:/adt-bundle-windows-x64/workspace/studio/frame/study_demo/testgreendao/src/main/java-gen";
        //调用DaoGenerator().generateAll方法自动生成代码到之前创建的java-gen目录下
        new DaoGenerator().generateAll(schema,outDir);

    }

    private static void addEntity(Schema schema) {
        //添加一个实体,则会自动生成实体Entity类
        Entity entity = schema.addEntity("Entity");
        //指定表名,如不指定,表名则为 Entity(即实体类名)
        entity.setTableName("student");
        //给实体类中添加属性(即给test表中添加字段)
        entity.addIdProperty().autoincrement();//添加Id,自增长
        entity.addStringProperty("name").notNull();//添加String类型的name,不能为空
        entity.addIntProperty("age");//添加Int类型的age
        entity.addDoubleProperty("score");//添加Double的score
    }
}

4.运行java代码,自动在Android project的java-gen目录下生成bean类和DAO类

5.新建MyApplication继承Application,并在Manifest文件中配置

public class MyApplication extends Application{

    public DaoSession daoSession;
    public SQLiteDatabase db;
    public DaoMaster.DevOpenHelper helper;
    public DaoMaster daoMaster;

    @Override
    public void onCreate() {
        super.onCreate();
        setupDatabase();
    }

    private void setupDatabase() {
        //创建数据库
        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
        // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
        helper = new DaoMaster.DevOpenHelper(this, "test", null);
        //得到数据库连接对象
        db = helper.getWritableDatabase();
        //得到数据库管理者
        daoMaster =new DaoMaster(db);
        //得到daoSession,可以执行增删改查操作
        daoSession = daoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return daoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }

}

6.编写MainActivity中的代码,实现用greenDAO进行数据库的操作

  • 布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <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">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:orientation="horizontal">
    
            <TextView
                android:id="@+id/tv_id"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="id:0" />
    
            <EditText
                android:id="@+id/et_name"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:hint="name" />
    
            <EditText
                android:id="@+id/et_age"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:hint="age" />
    
            <EditText
                android:id="@+id/et_score"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:hint="score" />
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/btn_add"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="add" />
    
            <Button
                android:id="@+id/btn_delete"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="delete" />
    
            <Button
                android:id="@+id/btn_update"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="update" />
    
            <Button
                android:id="@+id/btn_query"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_margin="5dp"
                android:layout_weight="1"
                android:text="query" />
        </LinearLayout>
    
        <ListView
            android:id="@+id/lv_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    
  • 初始化视图

    tv_id = (TextView)findViewById(R.id.tv_id);
    et_name = (EditText) findViewById(R.id.et_name);
    et_age = (EditText) findViewById(R.id.et_age);
    et_score = (EditText) findViewById(R.id.et_score);
    btn_add = (Button) findViewById(R.id.btn_add);
    btn_delete = (Button) findViewById(R.id.btn_delete);
    btn_update = (Button) findViewById(R.id.btn_update);
    btn_query = (Button) findViewById(R.id.btn_query);
    lv_list = (ListView) findViewById(R.id.lv_list);
    
  • 得到cursor对象

    String orderBy = EntityDao.Properties.Id.columnName + " DESC";//根据Id降序排序
    
    //查询,得到cursor
    cursor = getDb().query(getEntityDao().getTablename(), getEntityDao().getAllColumns(), null, null, null, null, orderBy);
    
  • 设置监听

    btn_add.setOnClickListener(this);
    btn_delete.setOnClickListener(this);
    btn_update.setOnClickListener(this);
    btn_query.setOnClickListener(this);
    
    adapter = new MyAdapter(this, cursor);
    lv_list.setAdapter(adapter);
    lv_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id_index) {
            id = cursor.getLong(0);
            tv_id.setText("id: "+id);
            et_name.setText(cursor.getString(1));
            et_age.setText(cursor.getInt(2) + "");
            et_score.setText(cursor.getDouble(3) + "");
        }
    });
    
  • 自定义CursorAdapter

    class MyAdapter extends CursorAdapter {
    
    
        public MyAdapter(Context context, Cursor cursor) {
            super(context, cursor);
        }
    
        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            ViewHolder holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.item_db, parent, false);
            holder.tv_id = (TextView) view.findViewById(R.id.tv_id);
            holder.tv_name = (TextView) view.findViewById(R.id.tv_name);
            holder.tv_age = (TextView) view.findViewById(R.id.tv_age);
            holder.tv_score = (TextView) view.findViewById(R.id.tv_score);
            view.setTag(holder);
            return view;
        }
    
        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            ViewHolder holder = (ViewHolder) view.getTag();
            long id = cursor.getLong(0);
            String name = cursor.getString(1);
            int age = cursor.getInt(2);
            double score = cursor.getDouble(3);
            holder.tv_id.setText(id + "");
            holder.tv_name.setText(name);
            holder.tv_age.setText(age + "");
            holder.tv_score.setText(score + "");
        }
    }
    
    static class ViewHolder {
        TextView tv_id;
        TextView tv_name;
        TextView tv_age;
        TextView tv_score;
    }
    
  • 数据库操作:增删改查的方法

    /**
     * 添加
     */
    private void addEntity() {
        if (!TextUtils.isEmpty(name)) {
            Entity entity = new Entity(null, name, age, score);
            //面向对象添加表数据
            getEntityDao().insert(entity);
            cursor.requery();//刷新
        } else {
            Toast.makeText(MainActivity.this, "name不能为空", Toast.LENGTH_SHORT).show();
        }
    }
    
    /**
     * 根据id删除
     *
     * @param id
     */
    private void deleteEntity(long id) {
        getEntityDao().deleteByKey(id);
        cursor.requery();
    }
    
    /**
     * 更新
     */
    private void updateList() {
        Entity entity = new Entity(id, name, age, score);
        getEntityDao().update(entity);
        cursor.requery();
    }
    
    /**
     * 根据name查询
     *
     * @param name
     */
    private void query(String name) {
        if (!TextUtils.isEmpty(this.name)) {
            // Query 类代表了一个可以被重复执行的查询
            Query<Entity> query = getEntityDao().queryBuilder()
                    .where(EntityDao.Properties.Name.eq(this.name))
                    .orderAsc(EntityDao.Properties.Id)
                    .build();
            // 查询结果以 List 返回
            List count = query.list();
            Toast.makeText(MainActivity.this, count.size() + "条数据被查到", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, "name不能为空", Toast.LENGTH_SHORT).show();
        }
    }
    

demo演示:

下载地址:
http://download.csdn.net/detail/benhuo931115/9483112

参考:

Android ORM 框架之 greenDAO 使用心得

greenDAO讲义(一):使用篇

你可能感兴趣的:(数据库,框架,推荐)