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