这里想说一下遇到的问题,和解决的方法。
首先,之前封装的那个DatabaseManager中的两个queryAll不好用,参数写的有问题(:P),我就加了个新方法。
public <T> int update(Class<T> tClass, String where, String[] args, String[] args2,
String[]args3){
return liteOrm.update(new WhereBuilder(tClass, where, args),new ColumnsValue(args2, args3)
, ConflictAlgorithm.None);
}
这个方法就是调用LiteOrm的update,然后其中的参数也是按照LiteOrm的参数添上去的。
额。感觉就是强行用了一下LiteOrm原本的update。
我的需求是,想记录我收藏过的视频,下面是实体类bean的代码:
@Table("Course")
public class CourseBean {
@PrimaryKey(AssignType.AUTO_INCREMENT)
private int id;
private int movieId;
private boolean isCollected;
public CourseBean(int movieId, boolean isCollected) {
this.movieId = movieId;
this.isCollected = isCollected;
}
public int getMovieId() {
return movieId;
}
public void setMovieId(int movieId) {
this.movieId = movieId;
}
public boolean isCollected() {
return isCollected;
}
public void setCollected(boolean collected) {
isCollected = collected;
}
}
实体类中含有三个属性,一个是id,自增长的主键。还有视频id和是否已收藏的boolean值。
之前忘了加主键的那个@,结果就出错了。一开始是以movieId作为主键的,在插入的时候发生了primarykey must be unique 的异常。改成现在这样就好了。
在界面初始化时候,先初始化收藏状态,使用成员变量isCollected记录:
//使用封装的线程池
MyThreadPool.getInstance().getThreadPoolExecutor().execute(new Runnable() {
@Override
public void run() {
//查询表中所有数据
List<CourseBean> courseBeanArrayList = DatabaseManager.getInstance()
.getQueryAll(CourseBean.class);
CourseBean nowBean = null;
//遍历数据,找到此次的movieId就保存到nowBean中
for (CourseBean courseBean : courseBeanArrayList) {
if (courseBean.getMovieId() == movieId) {
nowBean = courseBean;
Log.e(TAG, "run: i find it");
}
}
Log.e(TAG, "run: " + courseBeanArrayList.size());
//如果为null或者被收藏属性为false,设置相应的变化
if (nowBean == null || !nowBean.isCollected()) {
isCollected = false;
runOnUiThread(new Runnable() {
@Override
public void run() {
collectImg.setImageResource(R.mipmap.toolbar_collection_btn_normal);
}
});
} else {
isCollected = true;
runOnUiThread(new Runnable() {
@Override
public void run() {
collectImg.setImageResource(R.mipmap.toolbar_collection_btn_pressed);
}
});
}
}
});
收藏按钮被点击时候的点击事件为:
case R.id.course_collect:
//判断是否被收藏
if (isCollected) {
//判断是是否为第一次创建数据库,是的话,需要先进行insert操作,数据库才会被创建
if (isFirst) {
isFirst = false;
CourseBean courseBean = new CourseBean(movieId, false);
DatabaseManager.getInstance().insert(courseBean);
Log.e(TAG, "onClick: addnew false first" + movieId);
}else{
//先进行更新操作,如果获得的更新行数为0,则代表该movieId数据尚未被录入,需要insert
int rows = DatabaseManager.getInstance().update(CourseBean.class, "movieId=?",
new String[]{"" + movieId}, new String[]{"isCollected"}, new String[]{"false"});
Log.e(TAG, "onClick: update false");
if(rows == 0){
CourseBean courseBean = new CourseBean(movieId, false);
DatabaseManager.getInstance().insert(courseBean);
Log.e(TAG, "onClick: addnew false 0" + movieId);
}
}
collectImg.setImageResource(R.mipmap.toolbar_collection_btn_normal);
isCollected = false;
} else {
if (isFirst) {
isFirst = false;
CourseBean courseBean = new CourseBean(movieId, true);
DatabaseManager.getInstance().insert(courseBean);
Log.e(TAG, "onClick: addnew true first" + movieId);
}else{
int rows = DatabaseManager.getInstance().update(CourseBean.class,
"movieId=?",new String[]{"" + movieId}, new String[]{"isCollected"},
new String[]{"true"});
Log.e(TAG, "onClick: update true");
if(rows == 0){
CourseBean courseBean = new CourseBean(movieId, true);
DatabaseManager.getInstance().insert(courseBean);
Log.e(TAG, "onClick: addnew true 0" + movieId);
}
}
collectImg.setImageResource(R.mipmap.toolbar_collection_btn_pressed);
isCollected = true;
}
break;
就是记得如果第一次使用数据库先调用insert再调用其它方法。
/…………后记: 坑了整整一晚上,还是会的太少了,Come on !…………../