Giuthub:https://github.com/greenrobot/greenDAO greenDao官网:http://greenrobot.org/greendao/ greenDao2的引入地址(Github上面已经更新到greenDao3)
2.在build.gradle中进行配置:
apply plugin: 'org.greenrobot.greendao' buildscript { repositories { mavenCentral() } dependencies { classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0' } }3.自定义路径
greendao { schemaVersion 1 daoPackage 'com.anye.greendao.gen' targetGenDir 'src/main/java' }schemaVersion–> 指定数据库schema版本号,迁移等操作会用到; daoPackage –> dao的包名,包名默认是entity所在的包; targetGenDir –> 生成数据库文件的目录; 在创建实体类后make工程,相关的master类和session类和dao类都会生成在这个文件下
(一) @Entity 定义实体 @nameInDb 在数据库中的名字,如不写则为实体中类名 @indexes 索引 @createInDb 是否创建表,默认为true,false时不创建 @schema 指定架构名称为实体 @active 无论是更新生成都刷新 (二) @Id (三) @NotNull 不为null (四) @Unique 唯一约束 (五) @ToMany 一对多 (六) @OrderBy 排序 (七) @ToOne 一对一 (八) @Transient 不存储在数据库中 (九) @generated 由greendao产生的构造函数或方法
本文将从 数据库基础接口抽离,greenDao知识,greenDao的个性化基类封装和一个简单示例 为序向各位读者说明一下作者的思路以及实践。
数据库操作无非就是 增、删、改、查、事务,好接下来就可以细化了
插入 INSERT 删除 DELETE 改 UPDATE 查询 SELECT 事务 Transaction 事务 runInTx(Runnable runnable)public abstract class AbstractDatabaseManager<T,K> implements IDataBase<T,K> { private static final String DEFAULT_DATABASE_NAME = Constants.DEFAULT_DB_NAME; /** * The Android Activity reference for access to DatabaseManager. */ private static DaoMaster.DevOpenHelper mHelper; protected static DaoSession daoSession; /** * 初始化OpenHelper * @param context */ public static void initOpenHelper(@NonNull Context context) { mHelper = getOpenHelper(context, DEFAULT_DATABASE_NAME); openWritableDb(); } /** * 初始化OpenHelper * * @param context * @param dataBaseName */ public static void initOpenHelper(@NonNull Context context, @NonNull String dataBaseName) { mHelper = getOpenHelper(context, dataBaseName); openWritableDb(); } public static DaoSession getDaoSession() { return daoSession; } /** * Query for readable DB */ protected static void openReadableDb() throws SQLiteException { daoSession = new DaoMaster(getReadableDatabase()).newSession(); } /** * Query for writable DB */ protected static void openWritableDb() throws SQLiteException { daoSession = new DaoMaster(getWritableDatabase()).newSession(); } private static SQLiteDatabase getWritableDatabase() { return mHelper.getWritableDatabase(); } private static SQLiteDatabase getReadableDatabase() { return mHelper.getReadableDatabase(); } /** * 在applicaiton中初始化DatabaseHelper */ private static DaoMaster.DevOpenHelper getOpenHelper(@NonNull Context context, @Nullable String dataBaseName) { closeDbConnections();//关闭数据库 return new DaoMaster.DevOpenHelper(context, dataBaseName, null);//初始化数据库 } /** * 只关闭helper就好,看源码就知道helper关闭的时候会关闭数据库 */ public static void closeDbConnections() { if (mHelper != null) { mHelper.close(); mHelper = null; } if (daoSession != null) { daoSession.clear(); daoSession = null; } } @Override public boolean insert(T t) { try { if (t == null) return false; openWritableDb(); getAbstractDao().insert(t); } catch (SQLiteException e) { return false; } return true; } @Override public boolean delete(T t) { try { if (t == null) return false; openWritableDb(); getAbstractDao().delete(t); } catch (SQLiteException e) { return false; } return true; } @Override public boolean deleteByKey(K k) { try { if (TextUtils.isEmpty(k.toString())) return false; openWritableDb(); getAbstractDao().deleteByKey(k); } catch (SQLiteException e) { return false; } return true; } @Override public boolean deleteList(List<T> mList) { try { if (mList == null || mList.size() == 0) return false; openWritableDb(); getAbstractDao().deleteInTx(mList); } catch (SQLiteException e) { return false; } return true; } @Override public boolean deleteByKeyInTx(K... keys) { try { openWritableDb(); getAbstractDao().deleteByKeyInTx(keys); } catch (SQLiteException e) { return false; } return true; } @Override public boolean deleteAll() { try { openWritableDb(); getAbstractDao().deleteAll(); } catch (SQLiteException e) { return false; } return true; } @Override public boolean insertOrReplace(@NonNull T t) { try { if (t == null) return false; openWritableDb(); getAbstractDao().insertOrReplace(t); } catch (SQLiteException e) { return false; } return true; } @Override public boolean update(T t) { try { if (t == null) return false; openWritableDb(); getAbstractDao().update(t); } catch (SQLiteException e) { return false; } return true; } @Override public boolean updateInTx(T... t) { try { if (t == null) return false; openWritableDb(); getAbstractDao().updateInTx(t); } catch (SQLiteException e) { return false; } return true; } @Override public boolean updateList(List<T> mList) { try { if (mList == null || mList.size() == 0) return false; openWritableDb(); getAbstractDao().updateInTx(mList); } catch (SQLiteException e) { return false; } return true; } @Override public T selectByPrimaryKey(K key) { try { openReadableDb(); return getAbstractDao().load(key); } catch (SQLiteException e) { return null; } } @Override public List<T> loadAll() { openReadableDb(); return getAbstractDao().loadAll(); } @Override public boolean refresh(T t) { try { if (t == null) return false; openWritableDb(); getAbstractDao().refresh(t); } catch (SQLiteException e) { return false; } return true; } @Override public void clearDaoSession() { if (daoSession != null) { daoSession.clear(); daoSession = null; } } @Override public boolean dropDatabase() { try { openWritableDb(); // DaoMaster.dropAllTables(database, true); // drops all tables // mHelper.onCreate(database); // creates the tables // daoSession.deleteAll(BankCardBean.class); // clear all elements // from // a table } catch (Exception e) { return false; } return true; } @Override public void runInTx(Runnable runnable) { try { openWritableDb(); daoSession.runInTx(runnable); } catch (SQLiteException e) { } } @Override public boolean insertList(List<T> mList) { try { if (mList == null || mList.size() == 0) return false; openWritableDb(); getAbstractDao().insertInTx(mList); } catch (SQLiteException e) { return false; } return true; } @Override public boolean insertOrReplaceList(List<T> mList) { try { if (mList == null || mList.size() == 0) return false; openWritableDb(); getAbstractDao().insertOrReplaceInTx(mList); } catch (SQLiteException e) { return false; } return true; } @Override public QueryBuilder<T> getQueryBuilder() { openReadableDb(); return getAbstractDao().queryBuilder(); } @Override public List<T> queryRaw(String where, String... selectionArg) { openReadableDb(); return getAbstractDao().queryRaw(where, selectionArg); } public Query<T> queryRawCreate(String where, Object... selectionArg) { openReadableDb(); return getAbstractDao().queryRawCreate(where, selectionArg); } public Query<T> queryRawCreateListArgs(String where, Collection<Object> selectionArg) { openReadableDb(); return getAbstractDao().queryRawCreateListArgs(where, selectionArg); } /** * 设置debug模式开启或关闭,默认关闭 * @param flag */ public void setDebug(boolean flag){ QueryBuilder.LOG_SQL = flag; QueryBuilder.LOG_VALUES = flag; } /** * 获取Dao * @return */ protected abstract AbstractDao<T, K> getAbstractDao(); }
在Application 内初始化 helper:
AbstractDatabaseManager.initOpenHelper(getApplicationContext());//初始化数据库实体类:
@Entity(nameInDb = "NOTE") public class Note { @Id private Long id; @NotNull private String text; private String content; private java.util.Date date; @Generated(hash = 1272611929) public Note() { } public Note(Long id) { this.id = id; } @Generated(hash = 1657551704) public Note(Long id, @NotNull String text, String content, java.util.Date date) { this.id = id; this.text = text; this.content = content; this.date = date; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } @NotNull public String getText() { return text; } /** Not-null value; ensure this value is available before it is saved to the database. */ public void setText(@NotNull String text) { this.text = text; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public java.util.Date getDate() { return date; } public void setDate(java.util.Date date) { this.date = date; } }实际类:
public class NoteDbManager extends AbstractDatabaseManager<Note,Long> { @Override public AbstractDao<Note, Long> getAbstractDao() { return daoSession.getNoteDao(); } }调用:
new NoteDbManager().insert(note); new NoteDbManager().setDebug(true); new NoteDbManager().delete(note);上面的三种写法只是对不同层进行的分装,主要思想还是直接将dao层接口抽离出来操作,让结构更加合理。
文章部分内容转自博客:http://blog.csdn.net/sinat_15877283/article/details/51098477
