|  | /* | 
|  | * 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; | 
|  | } | 
|  | } |