GreenDao的使用

这里写图片描述
参考博客地址
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值