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