/******************************************************************************* * BBC News Reader * Released under the BSD License. See README or LICENSE. * Copyright (c) 2011, Digital Lizard (Oscar Key, Thomas Boby) * All rights reserved. ******************************************************************************/ package com.digitallizard.bbcnewsreader.data; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; public class DatabaseHelper { /** constants **/ private static final String DATABASE_NAME = "bbcnewsreader.db"; private static final int DATABASE_VERSION = 3; // table names public static final String ITEM_TABLE = "items"; public static final String CATEGORY_TABLE = "categories"; public static final String RELATIONSHIP_TABLE = "categories_items"; // column names public static final String COLUMN_CATEGORY_ID = "category_Id"; public static final String COLUMN_CATEGORY_NAME = "name"; public static final String COLUMN_CATEGORY_ENABLED = "enabled"; public static final String COLUMN_CATEGORY_URL = "url"; public static final String COLUMN_CATEGORY_PRIORITY = "priority"; public static final String COLUMN_ITEM_ID = "item_Id"; public static final String COLUMN_ITEM_TITLE = "title"; public static final String COLUMN_ITEM_DESCRIPTION = "description"; public static final String COLUMN_ITEM_PUBDATE = "pubdate"; public static final String COLUMN_ITEM_URL = "link"; public static final String COLUMN_ITEM_THUMBNAIL_URL = "thumbnailurl"; public static final String COLUMN_ITEM_HTML = "html"; public static final String COLUMN_ITEM_THUMBNAIL = "thumbnail"; public static final String COLUMN_RELATIONSHIP_ITEM_ID = "itemId"; public static final String COLUMN_RELATIONSHIP_CATEGORY_NAME = "categoryName"; public static final String COLUMN_RELATIONSHIP_PRIORITY = "priority"; /** variables **/ DatabaseOpenHelper databaseOpenHelper; public Cursor query(String table, String[] projection, String selection, String[] selectionArgs, String sortOrder, int limit) { // build a query SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables(table); // work out the limit String stringLimit = Integer.toString(limit); if (limit == -1) { stringLimit = null; } // perform the query Cursor cursor = builder.query(databaseOpenHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder, stringLimit); // return the cursor if it suitable if (cursor == null) { return null; } else if (cursor.getCount() == 0) { cursor.close(); return null; } return cursor; } public Cursor query(String table, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // call the main function with limit as -1 return query(table, projection, selection, selectionArgs, sortOrder, -1); } public long insert(String table, ContentValues values) { return getDatabase().insert(table, null, values); } public long insertWithOnConflict(String table, ContentValues values, int conflictAlgorithm) { return getDatabase().insertWithOnConflict(table, null, values, conflictAlgorithm); } public long insertOrThrow(String table, ContentValues values) throws SQLException { return getDatabase().insertOrThrow(table, null, values); } public int update(String table, ContentValues values, String selection, String[] selectionArgs) { return getDatabase().update(table, values, selection, selectionArgs); } public int updateWithOnConflict(String table, ContentValues values, String selection, String[] selectionArgs, int conflictAlgorithm) { return getDatabase().updateWithOnConflict(table, values, selection, selectionArgs, conflictAlgorithm); } public long replace(String table, ContentValues values) { return getDatabase().replace(table, null, values); } public int delete(String table, String selection, String selectionArgs[]) { return getDatabase().delete(table, selection, selectionArgs); } public void beginTransaction() { getDatabase().beginTransaction(); } public void setTransactionSuccessful() { getDatabase().setTransactionSuccessful(); } public void endTransaction() { getDatabase().endTransaction(); } public SQLiteDatabase getDatabase() { return databaseOpenHelper.getWritableDatabase(); } public DatabaseHelper(Context context) { databaseOpenHelper = new DatabaseOpenHelper(context); } private static class DatabaseOpenHelper extends SQLiteOpenHelper { @SuppressWarnings("unused") private final Context context; private SQLiteDatabase database; // define the tables private static final String CREATE_ITEM_TABLE = "CREATE TABLE " + ITEM_TABLE + "(item_Id integer PRIMARY KEY," + "title varchar(255), " + "description varchar(255), " + "link varchar(255) UNIQUE, " + "pubdate int, " + "html blob, " + "image blob, " + "thumbnail blob," + "thumbnailurl varchar(255))"; private static final String CREATE_CATEGORY_TABLE = "CREATE TABLE " + CATEGORY_TABLE + "(category_Id integer PRIMARY KEY," + "name varchar(255)," + "enabled int," + "url varchar(255), " + COLUMN_CATEGORY_PRIORITY + " int)"; private static final String CREATE_RELATIONSHIP_TABLE = "CREATE TABLE " + RELATIONSHIP_TABLE + "(categoryName varchar(255), " + "itemId INT," + "priority int," + "PRIMARY KEY (categoryName, itemId))"; @Override public void onCreate(SQLiteDatabase database) { this.database = database; // create the tables this.database.execSQL(CREATE_ITEM_TABLE); this.database.execSQL(CREATE_CATEGORY_TABLE); this.database.execSQL(CREATE_RELATIONSHIP_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // check what version to version upgrade we are performing if (oldVersion == 1 && newVersion == 2) { // drop tables db.execSQL("DROP TABLE " + ITEM_TABLE); db.execSQL("DROP TABLE " + RELATIONSHIP_TABLE); // create tables db.execSQL(CREATE_ITEM_TABLE); db.execSQL(CREATE_RELATIONSHIP_TABLE); } else if(oldVersion == 2 && newVersion == 3) { // add the priority column to the category table db.execSQL("ALTER TABLE " + CATEGORY_TABLE + " ADD COLUMN " + COLUMN_CATEGORY_PRIORITY + " int"); } else { // unsupported upgrade, reset everything db.execSQL("DROP TABLE " + ITEM_TABLE); db.execSQL("DROP TABLE " + CATEGORY_TABLE); db.execSQL("DROP TABLE " + RELATIONSHIP_TABLE); database.execSQL(CREATE_ITEM_TABLE); database.execSQL(CREATE_CATEGORY_TABLE); database.execSQL(CREATE_RELATIONSHIP_TABLE); } } @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE " + ITEM_TABLE); db.execSQL("DROP TABLE " + CATEGORY_TABLE); db.execSQL("DROP TABLE " + RELATIONSHIP_TABLE); database.execSQL(CREATE_ITEM_TABLE); database.execSQL(CREATE_CATEGORY_TABLE); database.execSQL(CREATE_RELATIONSHIP_TABLE); } DatabaseOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.context = context; } } }