`

简单通用的ContentProvider

阅读更多

常用简单的ContentProvider的实现差不多,整理了个通用的(基于com.example.android.supportv4.app.LoaderThrottleSupport.SimpleProvider修改), 从这个类继承,再重写几个方法就可以了,测试代码见附件。

 

 

package com.sh2600.test.contentprovider;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.provider.BaseColumns;

public class MyContentProvider extends SimpleContentProvider{	
	public static final String authority = MyContentProvider.class.getName();	
	/**
	 * table 1
	 */
	public static class Test1Table implements BaseColumns {
		public static String TableName = "test1";		
		public static Uri CONTENT_URI = Uri.parse("content://" + authority + "/" + TableName);	
		
		public static String FieldName 	= "name";
		public static String FieldX 	= "x";
	}	
	/**
	 * table 2
	 */
	public static class Test2Table implements BaseColumns {
		public static String TableName = "test2";		
		public static Uri CONTENT_URI = Uri.parse("content://" + authority + "/" + TableName);	
		
		public static String FieldName 	= "name";
		public static String FieldY 	= "y";
	}

	/**
	 * table 1 and 2 联合查询 或者用视图
	 */
	public static class TestsTable implements BaseColumns {
		public static String TableName = "test1,test2";		
		public static Uri CONTENT_URI = Uri.parse("content://" + authority + "/" + TableName);	
	}
	
	@Override
	protected String[] getTableNames() {
		//用到的表或视图都要加到这里!
		return new String[]{
			Test1Table.TableName,
			Test2Table.TableName,
			TestsTable.TableName
		};
	}
	
	/**
	 * SQLiteOpenHelper
	 */
	static class DatabaseHelper extends SQLiteOpenHelper {

       DatabaseHelper(Context context) {
           super(context, "test.db", null, 1);
       }
       
       @Override
       public void onCreate(SQLiteDatabase db) {
    	   //建表
           db.execSQL("CREATE TABLE " + Test1Table.TableName + " (" 
        		   		+ Test1Table._ID + " INTEGER PRIMARY KEY, "
        		   		+ Test1Table.FieldName + " varchar(50),"
        		   		+ Test1Table.FieldX + " INTEGER"
        		    + ");"
        	);
           //...
    	   //初始数据
           //...
       }

       @Override
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       }
   }	

	@Override
	protected String getAuthority() {
		return authority;
	}
	
	@Override
	protected SQLiteOpenHelper createDatabaseHelper(Context context) {
		return new DatabaseHelper(context);
	}

}

 

 

 SimpleContentProvider.java

import java.util.HashMap;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
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;
import android.provider.BaseColumns;
import android.support.v4.database.DatabaseUtilsCompat;
import android.text.TextUtils;

/**
 * 
 * @author J
 *
 */
public abstract class SimpleContentProvider extends ContentProvider{

    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.%s.%s";
    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.%s.%s";

    private final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 

    //
    private HashMap<Integer, String> hash_id_tableName = new HashMap<Integer, String>();

    private SQLiteOpenHelper mOpenHelper;
    
    protected abstract String getAuthority();    
    protected abstract SQLiteOpenHelper createDatabaseHelper(Context context);
    protected abstract String[] getTableNames();
    
    protected String getIdName(String tableName){
    	return BaseColumns._ID;
    }
    protected String getDefaultSort(String tableName){
    	return null;
    }
    
    /**
     * If URI is main table
     */
    private boolean isMain(int id){
    	return id % 2 == 1;
    }
    
    /**
     * Global provider initialization.
     */
    public SimpleContentProvider() {
        
        int id_main = 1, id_row = 2;
        String[] tableNames = getTableNames();
        for (String tableName : tableNames){
        	//奇数 for main table, 偶数 for row
        	mUriMatcher.addURI(getAuthority(), tableName, id_main);
        	mUriMatcher.addURI(getAuthority(), tableName + "/#", id_row);
        	
        	hash_id_tableName.put(id_main, tableName);        	        	
        	hash_id_tableName.put(id_row, tableName);
        	
        	id_main += 2;
        	id_row += 2;
        }
    }

    @Override
    public boolean onCreate() {
        mOpenHelper = createDatabaseHelper(getContext());
     
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {

        // Constructs a new query builder and sets its table name
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        
        int id = mUriMatcher.match(uri);        
        String tableName = hash_id_tableName.get(id);        
        if (tableName != null){
        	
        	qb.setTables(tableName);
        	
        	if (isMain(id)){
        		//qb.setProjectionMap(mNotesProjectionMap);
        	}
        	else{
        		//qb.setProjectionMap(mNotesProjectionMap);
                qb.appendWhere(getIdName(tableName) + "=?");
                selectionArgs = DatabaseUtilsCompat.appendSelectionArgs(selectionArgs,
                        new String[] { uri.getLastPathSegment() });                        		
        	}
        }
        else{
        	throw new IllegalArgumentException("Unknown URI " + uri);	
        }
        
        if (TextUtils.isEmpty(sortOrder)) {        	
            sortOrder = getDefaultSort(tableName);
        }

        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);

        c.setNotificationUri(getContext().getContentResolver(), uri);
        
        return c;
    }

    /**
     * Return the MIME type for an known URI in the provider.
     */
    @Override
    public String getType(Uri uri) {
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	if (tableName != null){
    		if (isMain(id)){
    			return String.format(CONTENT_TYPE, getAuthority(), tableName);
    		}
    		else{
    			return String.format(CONTENT_ITEM_TYPE, getAuthority(), tableName);
    		}
    	}
    	else{
    		throw new IllegalArgumentException("Unknown URI " + uri);
    	}
    	
    }

    /**
     * Handler inserting new data.
     */
    @Override
    public Uri insert(Uri uri, ContentValues initialValues) {
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	
    	if (tableName == null || !isMain(id)){
            // Can only insert into to main URI.
            throw new IllegalArgumentException("Unknown URI " + uri);
        }

        ContentValues values;

        if (initialValues != null) {
            values = new ContentValues(initialValues);
        } else {
            values = new ContentValues();
        }

        SQLiteDatabase db = mOpenHelper.getWritableDatabase();

        long rowId = db.insert(tableName, null, values);

        // If the insert succeeded, the row ID exists.
        if (rowId > 0) {
            //Uri noteUri = ContentUris.withAppendedId(MainTable.CONTENT_ID_URI_BASE, rowId);
        	Uri noteUri = ContentUris.withAppendedId(uri, rowId);
            getContext().getContentResolver().notifyChange(noteUri, null);
            return noteUri;
        }

        throw new SQLException("Failed to insert row into " + uri);
    }

    /**
     * Handle deleting data.
     */
    @Override
    public int delete(Uri uri, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        String finalWhere;

        int count;
        
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	if (tableName != null){
    		if (isMain(id)){
    			count = db.delete(tableName, where, whereArgs);
    		}
    		else{
                finalWhere = DatabaseUtilsCompat.concatenateWhere(
                		getIdName(tableName) + " = " + ContentUris.parseId(uri), where);
                count = db.delete(tableName, finalWhere, whereArgs);    			
    		}
    	}
    	else{
    		throw new IllegalArgumentException("Unknown URI " + uri);
    	}

        getContext().getContentResolver().notifyChange(uri, null);

        return count;
    }

    /**
     * Handle updating data.
     */
    @Override
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        int count;
        String finalWhere;
        
    	int id = mUriMatcher.match(uri);
    	String tableName = hash_id_tableName.get(id);
    	if (tableName != null){
    		if (isMain(id)){
    			// If URI is main table, update uses incoming where clause and args.
    			count = db.update(tableName, values, where, whereArgs);
    		}
    		else{
                // If URI is for a particular row ID, update is based on incoming
                // data but modified to restrict to the given ID.
                finalWhere = DatabaseUtilsCompat.concatenateWhere(
                		getIdName(tableName) + " = " + ContentUris.parseId(uri), where);
                count = db.update(tableName, values, finalWhere, whereArgs);    			
    		}
    	}
    	else{
    		throw new IllegalArgumentException("Unknown URI " + uri);
    	}

        getContext().getContentResolver().notifyChange(uri, null);

        return count;
    }
	
}

 

分享到:
评论

相关推荐

    ContentProvider工具类

    总结,ContentProvider工具类是Android开发中提升效率的好帮手,它简化了ContentProvider的使用,使得跨应用数据共享变得更为简单。正确理解和使用ContentProvider工具类,可以大大提高开发效率并保障数据操作的可靠...

    Android程序技术:ContentProvider.pptx

    Uri(通用资源标识符 Universal Resource Identifer),代表数据操作的地址,每一个ContentProvider发布数据时都会有唯一的地址。 比如:content://(固定写法)+com.android.contacts(包名,可变)+/contacts(path...

    Android 通用 帮助类

    - 文件读写:Android系统中,文件操作通常涉及到存储权限,SD卡读写,以及ContentProvider。帮助类可能包含方便的静态方法,用于读取文本文件、XML文件或者JSON数据。 - 文件流操作:对于大文件,使用输入/输出流...

    基于安卓的百科类通用项目Android应用源码

    【标签】"Android" 明确了这个项目的开发平台,Android是一个广泛使用的移动操作系统,它的API允许开发者创建各种各样的应用程序,从简单的工具到复杂的社交网络和游戏。开发Android应用需要掌握Android Studio IDE...

    IPCDemo跨进程通信

    Socket是一种通用的网络通信方式,适用于Android跨进程通信。通过TCP或UDP协议,应用可以创建服务器端和客户端,实现数据的双向传输。Socket适合于网络通信,但相对于Android原生的IPC方式,其开销较大,且需要处理...

    浅析什么是URI

    **URI**(Universal Resource Identifier,通用资源标识符)是一种用于唯一标识互联网上资源的标准方法。它为资源提供了一个可定位、可命名的引用方式,是现代互联网体系结构中的核心组成部分之一。简单来说,URI...

    跨进程通讯--访问其他应用程序的ActivityDemo

    ContentProvider是一种通用的跨进程数据共享方式,它可以暴露应用的数据供其他应用查询、修改。如果要访问其他应用的数据,可以通过ContentResolver来查询ContentProvider。 六、BroadcastReceiver ...

    Android-安卓跨进程跨app通信框架

    3. **ContentProvider**:ContentProvider是Android系统提供的一种通用的跨进程数据共享机制。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用查询、插入、更新或删除。框架可能提供对ContentProvider...

    Android页面传对象

    4. **Serializable**: Serializable是Java提供的通用序列化接口,适用于简单数据模型的传递。虽然实现简单,只需在类上添加Serializable接口,但序列化和反序列化过程相对较慢,占用资源较多,不推荐用于频繁的数据...

    CNF导航----building-common-navigator-framework-viewer-ii

    ### 构建通用导航框架(CNF)查看器——第二部分:添加内容 #### 概述 本篇文章将继续深入探讨如何构建一个通用导航框架(Common Navigator Framework,简称CNF)查看器,并着重介绍如何向该查看器添加内容扩展。...

    智能家居系统 AndroidManifest文件简介-教案.doc

    1. **演示**:展示一个简单的Android项目,分析其`AndroidManifest`文件,解释各部分的作用。 2. **讲授**:详细讲解各个元素的含义、用途和配置方式。 3. **讨论**:组织小组讨论,让学生自己分析和修改`...

    基于Android平台SQLite数据库技术在图书馆中的应用.docx

    3. **ContentProvider**:Android提供了一个通用的数据共享接口——ContentProvider,通过它可以实现跨应用程序的数据访问。在图书馆应用中,如果需要多个应用程序共享图书信息,可以考虑使用ContentProvider来管理...

    android实现收藏夹

    而ContentProvider可以作为一个通用接口,供其他应用访问你的收藏数据。 2. **SQLite数据库操作**:创建一个SQLite数据库需要定义SQLiteOpenHelper子类,重写onCreate()和onUpgrade()方法来创建表和升级表结构。...

    android媒体库使用demo及相关工具

    MediaStore是一个系统级的ContentProvider,它存储了设备上所有媒体文件的信息,包括音乐、视频、图片等。开发者可以通过ContentResolver查询MediaStore来获取这些信息,例如,获取手机上的所有音乐文件或特定类型的...

    Android应用源码之ListViewSample-IT计算机-毕业设计.zip

    - ArrayAdapter是最简单的Adapter,适用于简单数据结构,如字符串数组。它可以将数据项转化为ListView的列表项。 - BaseAdapter则是更通用的适配器,允许开发者自定义数据绑定逻辑和视图的创建。 3. **ListView的...

    基于Android的学生课表系统的设计与实现.pdf

    (2) 系统设置:为了提高系统的通用性和灵活性,用户进入系统后可以进行初始化设置,即设置系统基本参数,内容主要包括设置当前学年、学期,以及学期教学周数和开学日期等参数。 (3) 课表下载:由于各学期的课表信息...

    GreenDaoTest.rar

    在这个"GreenDaoTest.rar"压缩包中,我们可以看到一个针对GreenDao进行简单封装的示例,这个示例可以帮助我们更好地理解和应用GreenDao。 1. **实体类(Entity)**:在GreenDao中,数据模型通常以Java实体类的形式...

    《j2me手机程序eclipse开发基础》光盘源代码 非常好的东西

    4. **MIDP API**:学习如何使用MIDP API来实现用户界面、数据存储、网络通信等功能,包括Canvas类用于自定义绘图,Form和Item类用于创建简单的UI,以及Connection类进行HTTP或TCP/IP通信。 5. **SSH框架**:虽然...

    Android 事务提醒工具源码.zip源码资源下载

    1. **Android 应用程序结构**:在Android开发中,一个标准的应用通常包含多个组件,如Activity(用户界面)、Service(后台服务)、BroadcastReceiver(广播接收器)和ContentProvider(数据提供者)。这个提醒工具...

Global site tag (gtag.js) - Google Analytics