203 lines
7.9 KiB
Java
203 lines
7.9 KiB
Java
/*
|
|
* 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;
|
|
}
|
|
}
|