GreenDao的使用

来源:互联网 发布:机器人c语言编程 编辑:程序博客网 时间:2024/06/05 22:43

这里写图片描述
参考博客地址
http://www.open-open.com/lib/view/open1438065400878.html

greendao官网
http://greenrobot.org/greendao/

1、GreenDao的原理

这里写图片描述

1、DaoMaster:
持有数据库对象(SQLiteDatabase) ,并管理一些DAO类(不是对象)
能够创建和删除数据库表
它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper的实现类,用于创建SQLite数据库的模式

2、DaoSession:
管理制定模式下所有可用的DAO对象
能对实体进行插入、加载、更新、刷新、删除操作。

3、DAO:
Bean类

4、Entity
可持久化的对象,由generator 生成。相当于数据库中的一张表,所有字段都是使用标准的Java对象的属性
通过generator生成的这些工具类,你就可以在自己的Android工程中对进行数据库操作,完全不需要写任何SQL语句。

2、CRUD操作

创建数据库

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes", null);db = helper.getWritableDatabase();// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession();

1、创建表和表中字段、

在使用greendao缓存机制的情况下,如果数据表的主键是数字类型的话,一定要使用long类型,不然不会报类型转换错误

 Entity simple = schema.addEntity("SimpleEntity");    simple.addIdProperty();    simple.addBooleanProperty("simpleBoolean");    simple.addByteProperty("simpleByte");    simple.addShortProperty("simpleShort");    simple.addIntProperty("simpleInt");    simple.addLongProperty("simpleLong");    simple.addFloatProperty("simpleFloat");    simple.addDoubleProperty("simpleDouble");    simple.addStringProperty("simpleString");    simple.addByteArrayProperty("simpleByteArray");

2、查询

list() 所有实体载入内存,以ArrayList形式返回,使用最简单。
listLazy() 实体按需加载到内存。当列表中的其中一个元素第一次被访问,它会被加载并缓存备将来使用。使用完必须关闭。
listLazyUncached() 一个“虚拟”的实体列表:任何访问列表中的元素都会从数据库中读取。使用完必须关闭。
listIterator() 可迭代访问结果集,按需加载数据,数据不缓存。使用完必须关闭。

List joes = userDao.queryBuilder().where(Properties.FirstName.eq("Joe")).orderAsc(Properties.LastName).list();

3、更新

Note note = new Note(null, noteText, comment, new Date());noteDao.insert(note);

4、删除

 getNoteDao().deleteByKey(id);//通过id删除//getNoteDao().deleteAll();删除所有 cursor.requery();

5、打开调试语句

QueryBuilder.LOG_SQL = true;QueryBuilder.LOG_VALUES = true;

3、GreenDao的简单使用

这里写图片描述

package com.example.administrator.myapplication;import android.app.ListActivity;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.SimpleCursorAdapter;import android.widget.Toast;import java.text.DateFormat;import java.util.Date;import java.util.List;import de.greenrobot.dao.query.QueryBuilder;import me.itangqi.greendao.DaoMaster;import me.itangqi.greendao.DaoSession;import me.itangqi.greendao.Note;import me.itangqi.greendao.NoteDao;public class MainActivity extends ListActivity implements View.OnClickListener {    private EditText editText;    private Cursor cursor;    public static final String TAG = "DaoExample";    private Button btn_add;    private Button btn_search;    private SQLiteDatabase db;    private DaoMaster daoMaster;    private DaoSession daoSession;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn_add = (Button) findViewById(R.id.buttonAdd);        btn_search = (Button) findViewById(R.id.buttonSearch);        editText = (EditText) findViewById(R.id.edittext);        btn_add.setOnClickListener(this);        btn_search.setOnClickListener(this);        setupDatabase();        // 获取 NoteDao 对象        getNoteDao();        String textColumn = NoteDao.Properties.Text.columnName;        String orderBy = textColumn + " COLLATE LOCALIZED ASC";        cursor = db.query(getNoteDao().getTablename(), getNoteDao().getAllColumns(), null, null, null, null, orderBy);        String[] from = {textColumn, NoteDao.Properties.Comment.columnName};        int[] to = {android.R.id.text1, android.R.id.text2};        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from,                to);        setListAdapter(adapter);    }    private void setupDatabase() {        // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。        // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。        // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes", null);        db = helper.getWritableDatabase();        // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。        daoMaster = new DaoMaster(db);        daoSession = daoMaster.newSession();    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.buttonAdd:                addNote();                break;            case R.id.buttonSearch:                search();                break;            default:                break;        }    }    private void addNote() {        String noteText = editText.getText().toString();        editText.setText("");        final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);        String comment = "Added on " + df.format(new Date());        if (noteText == null || noteText.equals("")) {            Toast.makeText(MainActivity.this, "不能添加为空", Toast.LENGTH_SHORT).show();        } else {            // 插入操作,简单到只要你创建一个 Java 对象            Note note = new Note(null, noteText, comment, new Date());            getNoteDao().insert(note);            Log.d(TAG, "Inserted new note, ID: " + note.getId());            cursor.requery();        }    }    private void search() {        String noteText = editText.getText().toString();        editText.setText("");        if (noteText == null || noteText.equals("")) {            Toast.makeText(MainActivity.this, "不能查询为空", Toast.LENGTH_SHORT).show();        } else {            // Query 类代表了一个可以被重复执行的查询//            Query query = getNoteDao().queryBuilder()//                    .where(NoteDao.Properties.Text.eq(noteText))//                    .orderAsc(NoteDao.Properties.Date)//                    .build();            // 查询结果以 List 返回            //           List notes = query.list();            QueryBuilder<Note> query = getNoteDao().queryBuilder().where(NoteDao.Properties.Id.eq(noteText));            List<Note> notes = query.list();            Toast.makeText(MainActivity.this, "查询出" + notes.size() + "数据", Toast.LENGTH_SHORT).show();        }        // 在 QueryBuilder 类中内置两个 Flag 用于方便输出执行的 SQL 语句与传递参数的值        QueryBuilder.LOG_SQL = true;        QueryBuilder.LOG_VALUES = true;    }    @Override    protected void onListItemClick(ListView l, View v, int position, long id) {        // 删除操作,你可以通过「id」也可以一次性删除所有        getNoteDao().deleteByKey(id);//        getNoteDao().deleteAll();        cursor.requery();        Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();    }    private NoteDao getNoteDao() {        return daoSession.getNoteDao();    }}
1 0
原创粉丝点击