Initial Contribution
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user