常用简单的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工具类是Android开发中提升效率的好帮手,它简化了ContentProvider的使用,使得跨应用数据共享变得更为简单。正确理解和使用ContentProvider工具类,可以大大提高开发效率并保障数据操作的可靠...
Uri(通用资源标识符 Universal Resource Identifer),代表数据操作的地址,每一个ContentProvider发布数据时都会有唯一的地址。 比如:content://(固定写法)+com.android.contacts(包名,可变)+/contacts(path...
- 文件读写:Android系统中,文件操作通常涉及到存储权限,SD卡读写,以及ContentProvider。帮助类可能包含方便的静态方法,用于读取文本文件、XML文件或者JSON数据。 - 文件流操作:对于大文件,使用输入/输出流...
【标签】"Android" 明确了这个项目的开发平台,Android是一个广泛使用的移动操作系统,它的API允许开发者创建各种各样的应用程序,从简单的工具到复杂的社交网络和游戏。开发Android应用需要掌握Android Studio IDE...
Socket是一种通用的网络通信方式,适用于Android跨进程通信。通过TCP或UDP协议,应用可以创建服务器端和客户端,实现数据的双向传输。Socket适合于网络通信,但相对于Android原生的IPC方式,其开销较大,且需要处理...
**URI**(Universal Resource Identifier,通用资源标识符)是一种用于唯一标识互联网上资源的标准方法。它为资源提供了一个可定位、可命名的引用方式,是现代互联网体系结构中的核心组成部分之一。简单来说,URI...
ContentProvider是一种通用的跨进程数据共享方式,它可以暴露应用的数据供其他应用查询、修改。如果要访问其他应用的数据,可以通过ContentResolver来查询ContentProvider。 六、BroadcastReceiver ...
3. **ContentProvider**:ContentProvider是Android系统提供的一种通用的跨进程数据共享机制。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用查询、插入、更新或删除。框架可能提供对ContentProvider...
4. **Serializable**: Serializable是Java提供的通用序列化接口,适用于简单数据模型的传递。虽然实现简单,只需在类上添加Serializable接口,但序列化和反序列化过程相对较慢,占用资源较多,不推荐用于频繁的数据...
### 构建通用导航框架(CNF)查看器——第二部分:添加内容 #### 概述 本篇文章将继续深入探讨如何构建一个通用导航框架(Common Navigator Framework,简称CNF)查看器,并着重介绍如何向该查看器添加内容扩展。...
1. **演示**:展示一个简单的Android项目,分析其`AndroidManifest`文件,解释各部分的作用。 2. **讲授**:详细讲解各个元素的含义、用途和配置方式。 3. **讨论**:组织小组讨论,让学生自己分析和修改`...
3. **ContentProvider**:Android提供了一个通用的数据共享接口——ContentProvider,通过它可以实现跨应用程序的数据访问。在图书馆应用中,如果需要多个应用程序共享图书信息,可以考虑使用ContentProvider来管理...
而ContentProvider可以作为一个通用接口,供其他应用访问你的收藏数据。 2. **SQLite数据库操作**:创建一个SQLite数据库需要定义SQLiteOpenHelper子类,重写onCreate()和onUpgrade()方法来创建表和升级表结构。...
MediaStore是一个系统级的ContentProvider,它存储了设备上所有媒体文件的信息,包括音乐、视频、图片等。开发者可以通过ContentResolver查询MediaStore来获取这些信息,例如,获取手机上的所有音乐文件或特定类型的...
- ArrayAdapter是最简单的Adapter,适用于简单数据结构,如字符串数组。它可以将数据项转化为ListView的列表项。 - BaseAdapter则是更通用的适配器,允许开发者自定义数据绑定逻辑和视图的创建。 3. **ListView的...
(2) 系统设置:为了提高系统的通用性和灵活性,用户进入系统后可以进行初始化设置,即设置系统基本参数,内容主要包括设置当前学年、学期,以及学期教学周数和开学日期等参数。 (3) 课表下载:由于各学期的课表信息...
在这个"GreenDaoTest.rar"压缩包中,我们可以看到一个针对GreenDao进行简单封装的示例,这个示例可以帮助我们更好地理解和应用GreenDao。 1. **实体类(Entity)**:在GreenDao中,数据模型通常以Java实体类的形式...
4. **MIDP API**:学习如何使用MIDP API来实现用户界面、数据存储、网络通信等功能,包括Canvas类用于自定义绘图,Form和Item类用于创建简单的UI,以及Connection类进行HTTP或TCP/IP通信。 5. **SSH框架**:虽然...
1. **Android 应用程序结构**:在Android开发中,一个标准的应用通常包含多个组件,如Activity(用户界面)、Service(后台服务)、BroadcastReceiver(广播接收器)和ContentProvider(数据提供者)。这个提醒工具...