/*
* NovelCollectionModel ==> Details + Chapter list
* Nested Object:
* - ArrayList<BookModel>
* - ArrayList<PageModel>
*/
package com.dotcool.reader.helper.db;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.dotcool.reader.Constants;
import com.dotcool.reader.dao.NovelsDao;
import com.dotcool.reader.helper.DBHelper;
import com.dotcool.reader.model.BookModel;
import com.dotcool.reader.model.NovelCollectionModel;
import com.dotcool.reader.model.PageModel;
public class NovelCollectionModelHelper {
private static final String TAG = NovelCollectionModelHelper.class.toString();
private static DBHelper helper = NovelsDao.getInstance().getDBHelper();
// New column should be appended as the last column
public static final String DATABASE_CREATE_NOVEL_DETAILS = "create table if not exists "
+ DBHelper.TABLE_NOVEL_DETAILS + "(" + DBHelper.COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ DBHelper.COLUMN_PAGE + " text, "
+ DBHelper.COLUMN_SYNOPSIS + " text, "
+ DBHelper.COLUMN_IMAGE_NAME + " text, "
+ DBHelper.COLUMN_LAST_UPDATE + " integer, "
+ DBHelper.COLUMN_LAST_CHECK + " integer);";
public static NovelCollectionModel cursorToNovelCollection(Cursor cursor) {
NovelCollectionModel novelDetails = new NovelCollectionModel();
novelDetails.setId(cursor.getInt(0));
novelDetails.setPage(cursor.getString(1));
novelDetails.setSynopsis(cursor.getString(2));
novelDetails.setCover(cursor.getString(3));
novelDetails.setLastUpdate(new Date(cursor.getInt(4)*1000));
novelDetails.setLastCheck(new Date(cursor.getInt(5)*1000));
return novelDetails;
}
/*
* Query Stuff
*/
public static NovelCollectionModel getNovelDetails(SQLiteDatabase db, String page) {
Log.d(TAG, "Selecting Novel Details: " + page);
NovelCollectionModel novelDetails = getNovelDetailsOnly(db, page);
if(novelDetails != null) {
novelDetails.setPageModel(PageModelHelper.getPageModel(db, page));
// get the books
ArrayList<BookModel> bookCollection = BookModelHelper.getBookCollectionOnly(db, page, novelDetails);
// get the chapters
for(Iterator<BookModel> iBook = bookCollection.iterator(); iBook.hasNext();) {
BookModel book = iBook.next();
ArrayList<PageModel> chapters = getChapterCollection(db, novelDetails.getPage() + Constants.NOVEL_BOOK_DIVIDER + book.getTitle(), book);
book.setChapterCollection(chapters);
}
novelDetails.setBookCollections(bookCollection);
}
else {
Log.w(TAG, "No Data for Novel Details: " + page);
}
Log.d(TAG, "Complete Selecting Novel Details: " + page);
return novelDetails;
}
public static NovelCollectionModel getNovelDetailsOnly(SQLiteDatabase db, String page) {
NovelCollectionModel novelDetails = null;
Cursor cursor = helper.rawQuery(db, "select * from " + DBHelper.TABLE_NOVEL_DETAILS
+ " where " + DBHelper.COLUMN_PAGE + " = ? ", new String[] {page});
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
novelDetails = cursorToNovelCollection(cursor);
Log.d(TAG, "Found: " + novelDetails.toString());
break;
}
} finally{
if(cursor != null) cursor.close();
}
return novelDetails;
}
public static ArrayList<PageModel> getChapterCollection(SQLiteDatabase db, String parent, BookModel book) {
ArrayList<PageModel> chapters = new ArrayList<PageModel>();
Cursor cursor = helper.rawQuery(db, "select * from " + DBHelper.TABLE_PAGE
+ " where " + DBHelper.COLUMN_PARENT + " = ? order by " + DBHelper.COLUMN_ORDER, new String[] {parent});
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
PageModel chapter = PageModelHelper.cursorToPageModel(cursor);
chapter.setBook(book);
chapters.add(chapter);
Log.d(TAG, "Found: " + chapter.toString());
cursor.moveToNext();
}
} finally{
if(cursor != null) cursor.close();
}
return chapters;
}
public static void insertNovelDetailsImg(SQLiteDatabase db, NovelCollectionModel novelDetails){
ContentValues cv = new ContentValues();
cv.put(DBHelper.COLUMN_IMAGE_NAME, novelDetails.getCover());
NovelCollectionModel temp = getNovelDetailsOnly(db, novelDetails.getPage());
helper.update(db, DBHelper.TABLE_NOVEL_DETAILS, cv, DBHelper.COLUMN_ID + " = ?", new String[] {"" + temp.getId()});
}
/*
* Insert Stuff
*/
public static NovelCollectionModel insertNovelDetails(SQLiteDatabase db, NovelCollectionModel novelDetails){
ContentValues cv = new ContentValues();
cv.put(DBHelper.COLUMN_PAGE, novelDetails.getPage());
cv.put(DBHelper.COLUMN_SYNOPSIS, novelDetails.getSynopsis());
cv.put(DBHelper.COLUMN_IMAGE_NAME, novelDetails.getCover());
cv.put(DBHelper.COLUMN_LAST_CHECK, "" + (int) (new Date().getTime() / 1000));
// check if exist
NovelCollectionModel temp = getNovelDetailsOnly(db, novelDetails.getPage());
if(temp == null) {
Log.d(TAG, "Inserting Novel Details: " + novelDetails.getPage());
if(novelDetails.getLastUpdate() == null)
cv.put(DBHelper.COLUMN_LAST_UPDATE, 0);
else
cv.put(DBHelper.COLUMN_LAST_UPDATE, "" + (int) (novelDetails.getLastUpdate().getTime() / 1000));
helper.insertOrThrow(db, DBHelper.TABLE_NOVEL_DETAILS, null, cv);
}
else {
Log.d(TAG, "Updating Novel Details: " + novelDetails.getPage() + " id: " + temp.getId());
cv.put(DBHelper.COLUMN_LAST_UPDATE, "" + (int) (temp.getLastUpdate().getTime() / 1000));
helper.update(db, DBHelper.TABLE_NOVEL_DETAILS, cv, DBHelper.COLUMN_ID + " = ?", new String[] {"" + temp.getId()});
}
// insert book
for(BookModel book : novelDetails.getBookCollections()){
book.setPage(novelDetails.getPage());
book.setLastUpdate(novelDetails.getLastUpdate());
book = BookModelHelper.insertBookModel(db, book);
}
// insert chapter
for(Iterator<BookModel> iBooks = novelDetails.getBookCollections().iterator(); iBooks.hasNext();){
BookModel book = iBooks.next();
for(PageModel page : book.getChapterCollection()) {
PageModelHelper.insertOrUpdatePageModel(db, page, false);
}
}
Log.d(TAG, "Complete Insert Novel Details: " + novelDetails.toString());
// get updated data
novelDetails = getNovelDetails(db, novelDetails.getPage());
return novelDetails;
}
/*
* Delete Stuff
*/
public static void deleteNovelDetails(SQLiteDatabase db, NovelCollectionModel details) {
int result = helper.delete(db, DBHelper.TABLE_NOVEL_DETAILS, DBHelper.COLUMN_ID + " = ?", new String[]{"" + details.getId()});
Log.w(TAG, "NovelDetails Deleted: " + result);
}
public static boolean deleteNovel(SQLiteDatabase db, PageModel novel) {
try{
// TODO: delete images
// delete chapter and books
NovelCollectionModel details = getNovelDetails(db, novel.getPage());
if(details != null) {
ArrayList<BookModel> books = details.getBookCollections();
for (BookModel bookModel : books) {
BookModelHelper.deleteBookModel(db, bookModel);
}
deleteNovelDetails(db, details);
}
// delete page model;
PageModelHelper.deletePageModel(db, novel);
return true;
} catch(Exception ex) {
Log.e(TAG, "Error when deleting: " + novel.getPage(), ex);
return false;
}
}
}