ContentProvider實例

這篇文章記錄使用ContentProvider的方法,提供了最簡單安全的移植方法

首先在工程目錄建立包名對應的database目錄

放入如下三個文件:

DBHelper.java:

package com.sprd.fileexplorer.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * DBHelper
 * @author chrison.chai
 *
 */
public final class DBHelper extends SQLiteOpenHelper {
private static final String TAG = "DBHelper";
  private static final int DB_VERSION = 1;
  private static final String DB_NAME = "fileexplorer.db";
  public static final String ID = "_id";
  
  //favorate table
  public static final String TABLE_NAME_FAVORATE = "favorates";
  public static final String FAVORATE_TITLE = "title";
  public static final String FAVORATE_DATA = "_data";
  public static final String FAVORATE_DATE_MODIFIED = "date_modified";
  public static final String FAVORATE_SIZE = "_size";
  
  public DBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
  }
  
  private SQLiteDatabase mWritableDatabase;
  private SQLiteDatabase mReadableDatabase;
  
  public synchronized SQLiteDatabase openWritableDatabase() {
	  if (mWritableDatabase == null) {
		  mWritableDatabase = getWritableDatabase();
	  }
	  return mWritableDatabase;
  }
  
  public synchronized SQLiteDatabase openReadableDatabase() {
	  if (mReadableDatabase == null) {
		  mReadableDatabase = getReadableDatabase();
	  }
	  return mReadableDatabase;
  }
  
  public synchronized void closeReadableDatabase() {
	  if (mReadableDatabase != null && mReadableDatabase.isOpen()) {
		  mReadableDatabase.close();
		  mReadableDatabase = null;
	  }
  }
  
  public synchronized void closeWritableDatabase() {
	  if (mWritableDatabase != null && mWritableDatabase.isOpen()) {
		  mWritableDatabase.close();
		  mWritableDatabase = null;
	  }
  }
  
  public synchronized void closeDatabase() {
	  closeReadableDatabase();
	  closeWritableDatabase();
  }

  @Override
  public void onCreate(SQLiteDatabase sqLiteDatabase) {
	  Log.d("huasong", "oncreate db helper..");
  	  createFavorateTable(sqLiteDatabase);
  }
  
  private void createFavorateTable(SQLiteDatabase sqLiteDatabase) {
	  sqLiteDatabase.execSQL(
	            "CREATE TABLE " + TABLE_NAME_FAVORATE + " (" +
	            ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
	            FAVORATE_TITLE + " TEXT, " +
	            FAVORATE_DATA + " TEXT, " +
	            FAVORATE_DATE_MODIFIED + " TEXT, " +
	            FAVORATE_SIZE + " TEXT" +
	            ");");
  }
  
  @Override
  public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
	  sqLiteDatabase.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME_FAVORATE + ";");
      onCreate(sqLiteDatabase);
  }
}
FavorateContent.java:

package com.sprd.fileexplorer.database;


import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;

public class FavorateContent {

	public static final String PKG_NAME = "com.sprd.fileexplorer";
	public static final String AUTHORITY = PKG_NAME + ".provider.FavorateProvider";
    public static final String NOTIFIER_AUTHORITY =  PKG_NAME + ".notify.FavorateProvider";

    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
    
    public static final String _ID = "_id";

    public static final String[] COUNT_COLUMNS = new String[]{"count(*)"};

    public static final String[] ID_PROJECTION = new String[] {
    	_ID
    };
    public static final int ID_PROJECTION_COLUMN = 0;
    
    public static class FavorateFile extends FavorateContent{
    	public static final Uri CONTENT_URI = Uri.withAppendedPath(FavorateContent.CONTENT_URI, "favoratefile");
    }
    
    public static long existed(ContentResolver cr, Uri uri, String where, String[] selectionArgs) {
    	long id = -1;
		Cursor c = cr.query(uri, ID_PROJECTION, where, selectionArgs, null);
		if (c != null) {
			if (c.moveToNext()) {
				id = c.getLong(0);
			}
			c.close();
		}
		return id;
	}
	
	public static int update(ContentResolver cr, Uri uri, ContentValues values, String where, String[] selectionArgs) {
		return cr.update(uri, values, where, selectionArgs);
	}
	
	public static Uri insert(ContentResolver cr, Uri uri, ContentValues values) {
		return cr.insert(uri, values);
	}
	
	public static int delete(ContentResolver cr, Uri uri,  String where, String[] selectionArgs) {
		return cr.delete(uri, where, selectionArgs);
	}
}
FavorateProvider.java:
package com.sprd.fileexplorer.database;


import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;

public class FavorateProvider extends ContentProvider{
	private static final String TAG = "BjnoteProvider";
	private SQLiteDatabase mContactDatabase;
	private String[] mTables = new String[]{
			DBHelper.TABLE_NAME_FAVORATE,
	};
	private static final int BASE = 8;
	
	private static final int FAVORATE = 0x0000;
	private static final int FAVORATE_ID = 0x0001;
	
	
	private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
	 static {
	        // URI matching table
	        UriMatcher matcher = sURIMatcher;
	        matcher.addURI(FavorateContent.AUTHORITY, "favoratefile", FAVORATE);
	        matcher.addURI(FavorateContent.AUTHORITY, "favoratefile/#", FAVORATE_ID);
	        
	 }
	
	synchronized SQLiteDatabase getDatabase(Context context) {
		  Log.d("huasong", "getDatabase..");
        // Always return the cached database, if we've got one
        if (mContactDatabase != null) {
            return mContactDatabase;
        }


        DBHelper helper = new DBHelper(context);
        mContactDatabase = helper.getWritableDatabase();
        mContactDatabase.setLockingEnabled(true);
        return mContactDatabase;
	}
	
	@Override
	public boolean onCreate() {
		  Log.d("huasong", "onCreate return false..");
		return false;
	}
	
	/**
     * Wrap the UriMatcher call so we can throw a runtime exception if an unknown Uri is passed in
     * @param uri the Uri to match
     * @return the match value
     */
    private static int findMatch(Uri uri, String methodName) {
        int match = sURIMatcher.match(uri);
        if (match < 0) {
            throw new IllegalArgumentException("Unknown uri: " + uri);
        } 
        return match;
    }
    
    private void notifyChange(int match) {
    	Context context = getContext();
    	Uri notify = FavorateContent.CONTENT_URI;
    	switch(match) {
    	case FAVORATE:
    	case FAVORATE_ID:
    		notify = FavorateContent.FavorateFile.CONTENT_URI;
    		break;			
    	}
    	ContentResolver resolver = context.getContentResolver();
        resolver.notifyChange(notify, null);
    }

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int match = findMatch(uri, "delete");
        Context context = getContext();

        SQLiteDatabase db = getDatabase(context);
        String table = mTables[match>>BASE];
        int count = 0;
        switch(match) {
        default:
        	count = db.delete(table, buildSelection(match, uri, selection), selectionArgs);
        }
        if (count >0) notifyChange(match);
		return count;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		 int match = findMatch(uri, "insert");
         Context context = getContext();

         SQLiteDatabase db = getDatabase(context);
         String table = mTables[match>>BASE];
         if (values.containsKey(DBHelper.ID)) {
      		values.remove(DBHelper.ID);
      	 }
     	 long id = db.insert(table, null, values);
     	 if (id > 0) {
     		notifyChange(match);
   		    return ContentUris.withAppendedId(uri, id);
     	 }
		 return null;
	}
	private static final String[] COLUMN_NAME = { MediaStore.Images.ImageColumns.DATA};
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		 int match = findMatch(uri, "query");
         Context context = getContext();
         SQLiteDatabase db = getDatabase(context);
         int i =match>>BASE;
         String table = mTables[i];
         Cursor result = null;
         switch(match) {
         default:
        	     result = db.query(table, projection, selection, selectionArgs, null, null, sortOrder);
         }
         if(result != null)result.setNotificationUri(getContext().getContentResolver(), uri);
		return result;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int match = findMatch(uri, "update");
        Context context = getContext();
        
        SQLiteDatabase db = getDatabase(context);
        String table = mTables[match>>BASE];
        int count = 0;
        switch(match) {
        default:
        	    count = db.update(table, values, buildSelection(match, uri, selection), selectionArgs);
        }
        if (count >0) notifyChange(match);
		return count;
	}
	
	private String buildSelection(int match, Uri uri, String selection) {
		long id = -1;
		switch(match) {
	    	case FAVORATE_ID:
			try {
				id = ContentUris.parseId(uri);
			} catch(java.lang.NumberFormatException e) {
				e.printStackTrace();
			}
			break;
		}
		
		if (id == -1) {
			return selection;
		}
		StringBuilder sb = new StringBuilder();
		sb.append(DBHelper.ID);
		sb.append("=").append(id);
		if (!TextUtils.isEmpty(selection)) {
			sb.append(" and ");
			sb.append(selection);
		}
		return sb.toString();
	}
}
AndroidManifest.xml裏面加入:

        <provider android:name="com.sprd.fileexplorer.database.FavorateProvider"
            android:authorities="com.sprd.fileexplorer.provider.FavorateProvider"/>
調用insert方法保存數據:

            	ContentValues values = new ContentValues();
            	values.put(DBHelper.FAVORATE_TITLE, mClickedFile.getName());
            	values.put(DBHelper.FAVORATE_DATA, mClickedFile.getPath());
            	values.put(DBHelper.FAVORATE_DATE_MODIFIED, System.currentTimeMillis());
            	values.put(DBHelper.FAVORATE_SIZE, mClickedFile.length());
            	
            	FavorateContent.insert(mContext.getContentResolver(), FavorateContent.FavorateFile.CONTENT_URI, values);
調用uri = FavorateContent.FavorateFile.CONTENT_URI;進行查詢數據庫的值






發佈了122 篇原創文章 · 獲贊 26 · 訪問量 96萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章