/**
* @description:
* @author chenshiqiang E-mail:csqwyyx@163.com
* @date 2014年5月4日 下午10:13:07
* @version 1.0
*/
package com.csq.thesceneryalong.io.db;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.csq.thesceneryalong.db.Scenery;
import com.csq.thesceneryalong.db.SceneryDao;
import com.csq.thesceneryalong.db.SceneryDao.Properties;
import com.csq.thesceneryalong.db.Track;
import com.csq.thesceneryalong.logic.manager.TrackManager;
import com.csq.thesceneryalong.models.events.EventNewScenery;
import com.csq.thesceneryalong.models.events.EventSceneryNumChanged;
import com.csq.thesceneryalong.models.events.EventSceneryUpdated;
import com.csq.thesceneryalong.utils.dbmodel.SceneryUtil;
import de.greenrobot.dao.query.QueryBuilder;
import de.greenrobot.event.EventBus;
public class SceneryDb {
// ------------------------ Constants ------------------------
// ------------------------- Fields --------------------------
private static volatile SceneryDb instance;
public static SceneryDb getInstance(){
if(instance == null){
synchronized (SceneryDb.class) {
instance = new SceneryDb();
}
}
return instance;
}
private SceneryDao dao;
/**
* 当前记录的轨迹的所有点
*/
private List<Scenery> curScenerys = null;
// ----------------------- Constructors ----------------------
private SceneryDb(){
dao = DbManager.getInstance().getSceneryDao();
}
// -------- Methods for/from SuperClass/Interfaces -----------
// --------------------- Methods public ----------------------
/**
* @description: 轨迹开始或者恢复,开始缓存当前轨迹点信息
* @author: chenshiqiang E-mail:csqwyyx@163.com
* @param curTrack
*/
public synchronized void trackRecordStartOrResume(Track curTrack){
curScenerys = curTrack.getScenerys();
curTrack.resetScenerys();
if(curScenerys == null){
curScenerys = new ArrayList<Scenery>();
}
}
/**
* @description: 轨迹停止,需要清空轨迹点缓存
* @author: chenshiqiang E-mail:csqwyyx@163.com
*/
public synchronized void trackStoped(){
curScenerys = null;
}
/**
* @description: 添加轨迹点到当前轨迹
* @author: chenshiqiang E-mail:csqwyyx@163.com
* @return
*/
public synchronized long addToCurTrack(Scenery scenery){
long id = 0;
Track curTrack = TrackManager.getInstance().getCurTrack();
//没有记录的轨迹,返回
if(curTrack == null){
return id;
}
//插入数据库
scenery.setTrackId(curTrack.getId());
id = dao.insert(scenery);
//缓存到内存
if(curScenerys != null){
curScenerys.add(scenery);
}
//总风景数
curTrack.setSceneryNum(curTrack.getSceneryNum() + 1);
//更新轨迹
TrackDb.getInstance().update(curTrack, true);
//通知有新轨迹点
EventBus.getDefault().post(new EventNewScenery(scenery));
return id;
}
/**
* @description: ss必须设置trackId
* @author: chenshiqiang E-mail:csqwyyx@163.com
* @param ss
*/
public void addSome(Collection<Scenery> ss){
dao.insertInTx(ss);
}
/**
* @description: 删除一个风景,并删除文件
* @author: chenshiqiang E-mail:csqwyyx@163.com
* @param scenery
*/
public void delete(Scenery scenery){
//删除数据库
dao.delete(scenery);
//删除文件
File f = new File(SceneryUtil.getSceneryFilePath(scenery));
if(f.exists()){
f.delete();
}
//轨迹风景数减一
Track track = TrackDb.getInstance().queryById(scenery.getTrackId());
if(track != null){
track.setSceneryNum(track.getSceneryNum() - 1);
TrackDb.getInstance().update(track, true);
}
EventBus.getDefault().post(new EventSceneryNumChanged());
}
public void deleteByTrackId(long trackId){
try {
QueryBuilder<Scenery> b = dao.queryBuilder();
b.where(Properties.TrackId.eq(trackId));
dao.deleteInTx(b.list());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void update(Scenery p){
dao.update(p);
EventBus.getDefault().post(new EventSceneryUpdated(p));
}
public void updateSome(Collection<Scenery> ps){
dao.updateInTx(ps);
EventBus.getDefault().post(new EventSceneryUpdated(null));
}
public List<Scenery> queryScenerys(long trackId){
QueryBuilder<Scenery> b = dao.queryBuilder();
b.where(Properties.TrackId.eq(trackId));
return b.list();
}
public Scenery queryById(long sceneryId){
return dao.queryBuilder().where(Properties.Id.eq(sceneryId)).list().get(0);
}
// --------------------- Methods private ---------------------
// --------------------- Getter & Setter ---------------------
public List<Scenery> getCurScenerys() {
return curScenerys;
}
// --------------- Inner and Anonymous Classes ---------------
}