哈哈,这个功能是经常性的做到的
那么要怎么做呢,首先是不是点击的时候收藏到本地,如果再次点击就会取消收藏,这时候就要判断说他进来的时候是有收藏还是未收藏的啦!
那我们开始吧
1.
先依赖这个implementation 'org.greenrobot:greendao:3.2.2'
apply plugin: 'org.greenrobot.greendao' // apply plugin
greendao { schemaVersion 1 daoPackage 'com.test_collect' targetGenDir 'src/main/java' }
然后再gradle中配置
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
配置完之后make project!!!
2.进来的时候是不是要先初始化
在application中做
public static DaoSession getDaoSession() { if(daoSession ==null) { helper = new MySQLiteOpenHelper(mContext, "test.db", null); SQLiteDatabase db = helper.getWritableDatabase(); // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。 DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); } return daoSession; } /** * 关闭所有的操作,数据库开启后,使用完毕要关闭 */ public void closeConnection(){ closeHelper(); closeDaoSession(); } public void closeHelper(){ if(helper != null){ helper.close(); helper = null; } } public void closeDaoSession(){ if(daoSession != null){ daoSession.clear(); daoSession = null; } } public static CollectionDao getLocalAndRecomendBookDao(){ return getDaoSession().getCollectionDao(); }
这时候大家会发现怎么会是这个MySQLiteOpenHelper,哈哈我们后面再讲
3.接着要在收藏的界面中做初始化啦
private Collection collect;
private boolean isLocal;
// /*初始化收藏数据库相关*/ private void initDbHelp() { collect = LARBManager.getBook(title); if(collect != null){ img_collect.setImageResource(R.mipmap.collect_press); isLocal = true; }else { collect = new Collection(); collect.setHtml(url); collect.setTitle(title); collect.setImg_url(img_url); collect.setContent(content); collect.setCount(click); collect.setReadtime(readtime); img_collect.setImageResource(R.mipmap.collection); isLocal = false; } }
在管理器中以title 为主要的对象哈
public class LARBManager { public static CollectionDao dao = MyApplication.getLocalAndRecomendBookDao(); /** * 得到书架的数量 * @return */ public static int getCount(){ return (int) dao.queryBuilder().buildCount().count(); } /** * 得到书架所有的书籍 * @return */ public static List<Collection> getAllBook(){ return dao.queryBuilder().list(); } /** * 根据bookid得到书籍 * @param bookId * @return */ public static Collection getBook(String bookId){ if(bookId !=null) { return dao.queryBuilder().where(CollectionDao.Properties.Title.eq(bookId)) .unique(); } return null; } /** * 添加书籍到书架 * @param book */ public static void insertBook(Collection book){ dao.insertOrReplace(book); } public static void deleteBook(Collection book){ dao.delete(book); } /** * 修改 * @param book */ public static void updateBook(Collection book){ dao.update(book); } }
关键的时候来啦
/** * 添加和移除 到本地(收藏) */ private void addAndDeleteLocal(){ if(isLocal){ LARBManager.deleteBook(collect); img_collect.setImageResource(R.mipmap.collection); ToastUtils.showShort(getContext(),"取消收藏了哟"); } else { LARBManager.insertBook(collect); img_collect.setImageResource(R.mipmap.collect_press); ToastUtils.showShort(getContext(),"收藏了哟"); } isLocal = !isLocal; }
ok,这时候是不是觉得已经完成啦,哈哈哈
接着我们回到刚才的话题MySQLiteOpenHelper,这个为什么会替换成这个嘞,原本说好的是这个
public static DaoSession getDaoSession() { if(daoSession == null){ DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(mContext, "book.db", null); SQLiteDatabase db = helper.getWritableDatabase(); // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。 DaoMaster daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); daoSession.clear(); } return daoSession; }
但是由于更新版本的时候用了这个原本的DaoMaster.DevOpenHelper里面的数据会消失
所以才用到MySQLiteOpenHelper
public class MySQLiteOpenHelper extends DaoMaster.OpenHelper {
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, ifExists);
}
}, CollectionDao.class);
}
}
主要是在上面这个方法中做操作啦~
那在收藏列表里大家知道怎么做了嘛,对啦,就是去查询资料
private List<Collection> allBook;
/** * 获取数据来源,用于防止在详情界面点击取消收藏退回到收藏界面时候数据还存在onResume重新调用 */ public void getList(){ allBook = LARBManager.getAllBook(); if(allBook ==null ||"".equals(allBook)){ return; } Collections.reverse(allBook); collect_adapter.setData(allBook); collect_adapter.notifyDataSetChanged(); }
这个时候就可以拿到收藏列表啦~