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;进行查询数据库的值

时间: 2024-08-25 01:54:06

ContentProvider实例的相关文章

[Android] ContentProvider实例详解

1.ContentProvider是什么? ContentProvider(内容提供者)是Android的四大组件之一,管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用. Android的数据存储方式总共有五种,分别是:Shared Preferences.网络存储.文件存储.外储存储.SQLite.但一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,就会用到Cont

【Android】19.3 ContentProvider及安卓进一步封装后的相关类

分类:C#.Android.VS2015: 创建日期:2016-03-08 一.简介 ContentProvider:内容提供程序. Android的ContentProvider与.NET框架的EF(Entity Framework)非常类似.在EF中,每个类表示数据库中的一个表,类中的每个属性对应表的字段,类的每个实例表示数据库表的一行记录.同样,在Android中,每个ContentProvider类的实例表示数据表的一行记录,ContentProvider实例集合中的每一项表示数据表中的

解读Android之ContentProvider(2)创建自己的Provider

本文翻译自android官方文档,结合自己测试,整理如下. content provider管理数据的访问,我们可以在自己的应用程序中实现一个或多个自定义的provider(通过继承抽象类ContentProvider),当然这些provider需要在manifest文件中注册.尽管content provider是用来为其它程序来访问数据的,但是在自己程序中的activities显然可以对这些数据进行处理. 创建provider之前注意事项 确定是否需要提供content provider.若

[Android基础系列]重新审视ContentProvider

前言 上一篇文章梳理了一下Service,这一篇文章梳理一下同为四大组件之一的ContentProvider,也试着使用在线MarkDown编辑器.正常开发中,我们使用ContentProvider较少,大家也不会太过于关注.国内能看到的几篇文章也是比较老旧了,demo中也有一些错误,所以写一篇"像样"的,凑凑数. 正文 概述ContentProvider 依旧去API文档中先拿到官方的概述,并做一点蹩脚的翻译和注解: Content providers are one of the

[深入理解Android卷二 全文-第七章]深入理解ContentProvider

由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第7章  深入理解ContentProvider 本章主要内容: ·  深入分析ContentProvider的创建和启动,以及SQLite相关的知识点 ·  深入分析Cursor query和close函数的实现 ·  深入分析ContentResolver openAssetFileDescriptor函数

【0050】Android基础-36-内容提供者(ContentProvider)

[0]需要注意的特殊点: [0.1]数据库的创建中,第一列的id必须是下划线开头的: [1]内容提供者contentProvider实例 [1.1]创建数据库 [1.2]将张三李四数据取出来: [1.3]通过命令行查询数据 [1.4]更改dos工具的编码项的方法 出现乱码更改dos编码的方法: [1.5]数据的CURD:程序B在点击查询按钮后去查询程序A的数据

ContentResolver

如何使用ContentResolver (2012-03-26 11:48:08) 转载▼http://blog.csdn.net/android_ls/article/details/8606014 标签: it android contenresolver 杂谈 分类: android 如果想公开自己的数据,那么可有两种办法:1.创建自己的ContentProvider,需要继承ContentProvider类2.如果你的数据和已存在的ContentProvider数据结构一致,可以将数据写

Android之——断点下载示例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46897641 在上一篇博文<Android之--多线程下载示例>中,我们讲解了如何实现Android的多线程下载功能,通过将整个文件分成多个数据块,开启多个线程,让每个线程分别下载一个相应的数据块来实现多线程下载的功能.多线程下载中,可以将下载这个耗时的操作放在子线程中执行,即不阻塞主线程,又符合Android开发的设计规范. 但是当下载的过程当中突然出现手机卡死,或者网络中断

Android四大组件之Content Provider

ContentProvider:内容提供者 1.为存储和读取数据提供了统一的接口 2.使用ContentProvider,应用程序可以实现数据共享 3.android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等) 4.当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据. 先来了解一下Uri: Uri,即通用资源标识符 1.Uri代表要操作的数据,Android上可用的每种资源 -