参考博客地址
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();
}
}