项目中突然想用Content Provider实现跨应用操作数据的功能,虽然后来没有利用Content Provider来实现。但还是写了个简单demo程序,熟悉一下Content Provider的开发。这篇文章只是简单记录下,下一篇文章具体解释需要注意的问题
两个项目,一个继承Content Provider将数据库的CRUD操作显露给其他应用,另一个项目,则是进行CRUD操作。很简单的功能。
-----------------------------------------------------------
项目1:
首先创建 DatabaseHelper
private static String DATABASE_NAME = "db_name"; public static String TABLE_NAME = "db_table_name"; public static String COL_ID = "_id"; public static String COL_TXT = "txt"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("create table if not exists " + TABLE_NAME + "(" + COL_ID + " integer primary key autoincrement, " + COL_TXT + " text )"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub db.execSQL("drop table if exists " + TABLE_NAME); onCreate(db); }
然后实现 Content Provider功能
private static final String TAG = "TestContentProvider"; private DatabaseHelper dbHelper; // public constants for client development public static final String AUTHORITY = "info.zhegui.contentprovider.provider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + DatabaseHelper.TABLE_NAME); // helper constants for use with the UriMatcher private static final int LENTITEM_LIST = 1; private static final int LENTITEM_ID = 2; private static final UriMatcher URI_MATCHER; /** * Column and content type definitions for the LentItemsProvider. */ public static interface LentItems extends BaseColumns { public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.info.zhegui.provider." + DatabaseHelper.TABLE_NAME; public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.info.zhegui.provider." + DatabaseHelper.TABLE_NAME; } static { URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); URI_MATCHER.addURI(AUTHORITY, DatabaseHelper.TABLE_NAME, LENTITEM_LIST); URI_MATCHER.addURI(AUTHORITY, DatabaseHelper.TABLE_NAME + "/#", LENTITEM_ID); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int rowNum = dbHelper.getWritableDatabase().delete( DatabaseHelper.TABLE_NAME, selection, selectionArgs); return rowNum; } @Override public String getType(Uri uri) { switch (URI_MATCHER.match(uri)) { case LENTITEM_LIST: return LentItems.CONTENT_TYPE; case LENTITEM_ID: return LentItems.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { long rowId = dbHelper.getWritableDatabase().insert( DatabaseHelper.TABLE_NAME, null, values); return Uri.parse(CONTENT_URI + "/" + rowId); } @Override public boolean onCreate() { dbHelper = new DatabaseHelper(getContext()); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if (URI_MATCHER.match(uri) != LENTITEM_LIST) { throw new IllegalArgumentException( "Unsupported URI for insertion: " + uri); } return dbHelper.getReadableDatabase().query(DatabaseHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, null); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int rowNum = dbHelper.getWritableDatabase().updateWithOnConflict( DatabaseHelper.TABLE_NAME, values, selection, selectionArgs, SQLiteDatabase.CONFLICT_FAIL); return rowNum; }
接下来在manifest中声明
<provider android:name="TestContentProvider" android:authorities="info.zhegui.contentprovider.provider" android:exported="true" />
ok,项目就完成了。就是这么简单!
-------------------------------------------------------------------------------------------
项目2:
只是简单调用CRUD操作,直接上代码
public static String TABLE_NAME = "db_table_name"; public static final String AUTHORITY = "info.zhegui.contentprovider.provider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME); public static String COL_ID = "_id"; public static String COL_TXT = "txt"; public static interface LentItems extends BaseColumns { public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.info.zhegui.provider." + TABLE_NAME; public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.info.zhegui.provider." + TABLE_NAME; } private EditText etIccid; private ListView listView; private CustomAdapter mAdapter; private Handler handler; private List<Item> listData = new ArrayList<Item>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler = new Handler(this); etIccid = (EditText) findViewById(R.id.et); listView = (ListView) findViewById(R.id.listview); mAdapter = new CustomAdapter(); ((Button) findViewById(R.id.btn_add)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final String txt = etIccid.getEditableText().toString(); if (!TextUtils.isEmpty(txt)) { new Thread() { public void run() { ContentValues values = new ContentValues(); values.put(COL_TXT, txt); Uri uri = getContentResolver().insert( CONTENT_URI, values); if (uri != null) { getData(); } } }.start(); } etIccid.setText(""); } }); listView.setAdapter(mAdapter); getData(); } private synchronized void getData() { new Thread() { public void run() { listData.clear(); Cursor cursor = getContentResolver().query(CONTENT_URI, null, null, null, null); Log.i(TAG, "line 100 cursor:" + cursor); if (cursor != null) { while (cursor.moveToNext()) { long id = cursor.getLong(cursor.getColumnIndex(COL_ID)); String str = cursor.getString(cursor .getColumnIndex(COL_TXT)); listData.add(new Item(id, str)); } } handler.sendEmptyMessage(0); } }.start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public static class ViewHolder { EditText et; Button btnUpdate; Button btnDelete; } public class Item { long id; public Item(long id, String str) { this.id = id; this.txt = str; } public long getId() { return id; } public String getTxt() { return txt; } String txt; } public class CustomAdapter extends BaseAdapter { public CustomAdapter() { } @Override public int getCount() { return listData.size(); } @Override public Object getItem(int position) { return listData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(MainActivity.this).inflate( R.layout.list_item, parent, false); holder.et = (EditText) convertView.findViewById(R.id.et_item); holder.btnUpdate = (Button) convertView .findViewById(R.id.btn_update); holder.btnDelete = (Button) convertView .findViewById(R.id.btn_delete); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.et.setText(listData.get(position).getTxt()); holder.et.setTag("et_" + position); holder.btnDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // listData.remove(position); // mAdapter.notifyDataSetChanged(); int rowId = getContentResolver() .delete(CONTENT_URI, COL_ID + " =? ", new String[] { listData.get(position) .getId() + "" }); if (rowId != 0) { getData(); } } }); holder.btnUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String et = ((EditText) listView.findViewWithTag("et_" + position)).getText().toString(); if (!TextUtils.isEmpty(et)) { // listData.set(position, et); // mAdapter.notifyDataSetChanged(); ContentValues values = new ContentValues(); values.put(COL_TXT, et); int rowId = getContentResolver().update( CONTENT_URI, values, COL_ID + " =? ", new String[] { listData.get(position).getId() + "" }); if (rowId != 0) { getData(); } } } }); return convertView; } } @Override public boolean handleMessage(Message msg) { mAdapter.notifyDataSetChanged(); return false; }
。
附2个项目源码
相关推荐
这篇博文的示例程序"android content provider示例程序(简单记账)"旨在帮助开发者理解如何实现一个基础的Content Provider,并将其应用到一个简单的记账软件中。 首先,我们需要了解Content Provider的基本结构。...
理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。
Content Provider是Android系统提供的一种机制,允许应用程序暴露自己的数据给其他应用,或者获取其他应用公开的数据。它遵循严格的读写权限控制,确保数据的安全性。在这个Demo中,我们将学习如何创建一个基本的...
要创建一个Content Provider,你需要定义一个继承自`android.content.ContentProvider`的类,并实现其中的方法,如`query()`、`insert()`、`update()`、`delete()`等。 接下来,我们讨论SQLite数据库。SQLite是一种...
接下来,我们探讨如何实现一个简单的Content Provider。以提供的Sample_4_4_ContentProvider为例,假设我们要实现一个存储书籍信息的Content Provider: 1. 定义ContentContract,如`BookContract`,其中包含书籍...
在Xh_ContentProvider_Test这个压缩包中,可能包含了上述所有代码示例的实现,以及一个测试用例,用于验证Content Provider的功能是否正常。通过运行这个测试用例,你可以了解如何在实际项目中使用自定义的Content ...
通过Content Provider,一个应用可以将自己的数据暴露给其他应用,同时也可以访问其他应用公开的数据。这一机制遵循严格的权限控制,确保数据安全。 首先,创建Content Provider需要定义一个继承自`android.content...
在提供的"SMS_Gank"文件中,可能包含了一个简单的示例,演示了如何创建一个用于共享短信数据的Content Provider。这个例子可能包含了创建数据库表、处理Uri请求以及如何在其他应用中使用这个Provider的方法。对于...
在"android-simple-content-provider-app"中,你可能会发现一个简单的数据模型,比如存储联系人或者任务信息。 1. **创建Content Provider** 要创建Content Provider,你需要创建一个新的Java类并继承自`android....
"content-provider-sample"是一个示例项目,展示了如何创建一个简单的Content Provider。这个项目对于初学者来说,是理解Content Provider工作原理和实现机制的一个很好的起点。下面将详细解释Content Provider以及...
例如,创建一个简单的Content Provider用于管理书籍信息: ```java public class MyBookProvider extends ContentProvider { // ... 初始化、URI匹配规则等代码 ... @Override public Cursor query(Uri uri, ...
首先,我们需要创建一个Content Provider类,继承自ContentProvider,并实现其关键方法,如: - onCreate():初始化Content Provider。 - query():处理查询请求,返回Cursor。 - insert():处理插入数据请求。 - ...
接下来,可以尝试自己编写一个简单的Content Provider,最后结合实际项目需求,实践Content Provider的高级用法,如跨进程通信和异步数据处理。 9. **应用场景** Content Provider广泛应用于不同应用间的通讯,如...
Content Provider作为Android四大组件之一,是Android系统中实现数据共享的关键机制。本文将详细阐述Content Provider的定义、配置、功能以及如何通过Uri进行数据操作,帮助开发者更好地理解和运用这一核心组件。 ...
通过以上步骤,你可以实现一个简单的`FileProvider` demo,如`FileProviderDemo`所示,适配Android 7.0,实现系统拍照和裁剪图片的功能。在实际应用中,还可以根据需求扩展,如支持多种类型的文件,或者在多线程环境...
这个项目通过提供一个简单的屏幕截图和应用展示,向开发者展示了如何实现和运用Content Provider来分享随机生成的信息。 首先,我们要理解Content Provider的基本概念。Content Provider是Android系统中的一个接口...
学习这个"Provider简单demo",初学者可以理解`ContentProvider`的基本工作流程,掌握如何创建自己的`ContentProvider`,以及如何在应用间共享数据。实践这部分知识,有助于提升Android开发能力,为后续更复杂的项目...
首先,Content Provider是Android系统提供的一种机制,使得应用程序可以将自己的数据暴露给其他应用,或者访问其他应用的数据。这对于数据的跨应用共享至关重要,特别是当数据存储在SQLite数据库或其他私有文件系统...