/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.codelab.rssexample;
import android.content.ContentProvider;
import android.content.ContentProviderDatabaseHelper;
import android.content.UriMatcher;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.content.ContentValues;
import android.text.TextUtils;
import java.util.logging.Logger;
// Content Provider for RSS feed information. Each row describes a single
// RSS feed. See the public static constants at the end of this class
// to learn what each record contains.
public class RssContentProvider extends ContentProvider {
private Logger mLogger = Logger.getLogger("com.example.codelab.rssexample");
private SQLiteDatabase mDb;
private DatabaseHelper mDbHelper = new DatabaseHelper();
private static final String DATABASE_NAME = "rssitems.db";
private static final String DATABASE_TABLE_NAME = "rssItems";
private static final int DB_VERSION = 1;
private static final int ALL_MESSAGES = 1;
private static final int SPECIFIC_MESSAGE = 2;
// Set up our URL matchers to help us determine what an
// incoming URI parameter is.
private static final UriMatcher URI_MATCHER;
static{
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
URI_MATCHER.addURI("my_rss_item", "rssitem", ALL_MESSAGES);
URI_MATCHER.addURI("my_rss_item", "rssitem/#", SPECIFIC_MESSAGE);
}
// Here's the public URI used to query for RSS items.
public static final Uri CONTENT_URI = Uri.parse( "content://my_rss_item/rssitem");
// Here are our column name constants, used to query for field values.
public static final String ID = "_id";
public static final String URL = "url";
public static final String TITLE = "title";
public static final String HAS_BEEN_READ = "hasbeenread";
public static final String CONTENT = "rawcontent";
public static final String LAST_UPDATED = "lastupdated";
public static final String DEFAULT_SORT_ORDER = TITLE + " DESC";
// Database creation/version management helper.
// Create it statically because we don't need to have customized instances.
private static class DatabaseHelper extends ContentProviderDatabaseHelper{
@Override
public void onCreate(SQLiteDatabase db){
try{
String sql = "CREATE TABLE " + DATABASE_TABLE_NAME + "(" +
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
URL + " TEXT," +
TITLE + " TEXT," +
HAS_BEEN_READ + " BOOLEAN DEFAULT 0," +
CONTENT + " TEXT," +
LAST_UPDATED + " INTEGER DEFAULT 0);";
Logger.getLogger("com.example.codelab.rssexample").info("DatabaseHelper.onCreate(): SQL statement: " + sql);
db.execSQL(sql);
Logger.getLogger("com.example.codelab.rssexample").info("DatabaseHelper.onCreate(): Created a database");
} catch (SQLException e) {
Logger.getLogger("com.example.codelab.rssexample").warning("DatabaseHelper.onCreate(): Couldn't create a database!");
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
// Don't have any upgrades yet, so if this gets called for some reason we'll
// just drop the existing table, and recreate the database with the
// standard method.
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_NAME + ";");
}
}
@Override
public boolean onCreate() {
// First we need to open the database. If this is our first time,
// the attempt to retrieve a database will throw
// FileNotFoundException, and we will then create the database.
final Context con = getContext();
try{
mDb = mDbHelper.openDatabase(getContext(), DATABASE_NAME, null, DB_VERSION);
mLogger.info("RssContentProvider.onCreate(): Opened a database");
} catch (Exception ex) {
return false;
}
if(mDb == null){
return false;
} else {
return true;
}
}
// Convert the URI into a custom MIME type.
// Our UriMatcher will parse the URI to decide whether the
// URI is for a single item or a list.
@Override
public String getType(Uri uri) {
switch (URI_MATCHER.match(uri)){
case ALL_MESSAGES:
return "vnd.android.cursor.dir/rssitem"; // List of items.
case SPECIFIC_MESSAGE:
return "vnd.android.cursor.item/rssitem"; // Specific item.
default:
return null;
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String groupBy, String having, String sortOrder) {
// We won't bother checking the validity of params here, but you should!
// SQLiteQueryBuilder is the helper class that creates the
// proper SQL syntax for us.
SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();
// Set the table we're querying.
qBuilder.setTables(DATABASE_TABLE_NAME);
// If the query ends in a specific record number, we're
// being asked for a specific record, so set the
// WHERE clause in our query.
if((URI_MATCHER.match(uri)) == SPECIFIC_MESSAGE){
qBuilder.appendWhere("_id=" + uri.getPathLeafId());
}
// Set sort order. If none specified, use default.
if(TextUtils.isEmpty(sortOrder)){
sortOrder = DEFAULT_SORT_ORDER;
}
// Make the query.
Cursor c = qBuilder.query(mDb,
projection,
selection,
selectionArgs,
groupBy,
having,
sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int update(Uri uri, ContentValues values, String whereClause) {
// NOTE Argument checking code omitted. Check your parameters!
int updateCount = mDb.update(DATABASE_TABLE_NAME, values, whereClause);
// Notify any listeners and return the updated row count.
getContext().getContentResolver().notifyUpdate(uri, null);
return updateCount;
}
@Override
public Uri insert(Uri requestUri, ContentValues initialValues) {
// NOTE Argument checking code omitted. Check your parameters! Check that
// your row addition request succeeded!
long rowId = -1;
rowId = mDb.insert(DATABASE_TABLE_NAME, "rawcontent", initialValues);
Uri newUri = CONTENT_URI.addId(rowId);
// Notify any listeners and return the URI of the new row.
getContext().getContentResolver().notifyInsert(CONTENT_URI, null);
return newUri;
}
@Override
public int delete(Uri uri, String where) {
// NOTE Argument checking code omitted. Check your parameters!
int rowCount = mDb.delete(DATABASE_TABLE_NAME, ID + " = " + uri.getPathLeafId());
// Notify any listeners and return the deleted row count.
getContext().getContentResolver().notifyDelete(uri, null);
return rowCount;
}
}