package org.openintents.filemanager.search; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; /** * Used by the standard search Service, in order to provide results asynchronously to the SearchableActivity. * @author George Venios * */ public class SearchResultsProvider extends ContentProvider { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "filemanager_search.db"; private static final String TABLE_NAME = "search_results"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_NAME = "NAME"; public static final String COLUMN_PATH = "PATH"; private static final String DATABASE_CREATE = String.format( "CREATE TABLE %s (%s integer primary key autoincrement, " + "%s text not null, %s text not null);", TABLE_NAME, COLUMN_ID, COLUMN_NAME, COLUMN_PATH); public static final String SEARCH_MIMETYPE = "vnd.android.cursor.item/vnd.openintents.search_result"; public static final String PROVIDER_NAME = "org.openintents.filemanager.search"; public static final Uri CONTENT_URI = Uri.parse("content://" + PROVIDER_NAME); private DatabaseHelper dbHelper; private SQLiteDatabase db; @Override public boolean onCreate() { dbHelper = new DatabaseHelper(getContext()); db = dbHelper.getWritableDatabase(); return (dbHelper == null) ? false : true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder(); sqlBuilder.setTables(TABLE_NAME); if (sortOrder == null || sortOrder == "") sortOrder = COLUMN_ID; Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public Uri insert(Uri uri, ContentValues values) { long rowID = db.insert(TABLE_NAME, "", values); if (rowID > 0) { Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to insert row into " + uri); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // We only write, read and delete the db. Not implemented for now. return 0; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = db.delete(TABLE_NAME, selection, selectionArgs); getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { return SEARCH_MIMETYPE; } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } } }