`
xinanadu
  • 浏览: 232252 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

简单实现自己的Content Provider(一)

 
阅读更多

项目中突然想用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个项目源码

 

0
2
分享到:
评论

相关推荐

    android content provider示例程序(简单记账)

    这篇博文的示例程序"android content provider示例程序(简单记账)"旨在帮助开发者理解如何实现一个基础的Content Provider,并将其应用到一个简单的记账软件中。 首先,我们需要了解Content Provider的基本结构。...

    Android新手Content Provider获取通讯录,短信,通话记录

    理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。

    Android Content Provider Demo

    Content Provider是Android系统提供的一种机制,允许应用程序暴露自己的数据给其他应用,或者获取其他应用公开的数据。它遵循严格的读写权限控制,确保数据的安全性。在这个Demo中,我们将学习如何创建一个基本的...

    content provider 和sqllite用法整理

    要创建一个Content Provider,你需要定义一个继承自`android.content.ContentProvider`的类,并实现其中的方法,如`query()`、`insert()`、`update()`、`delete()`等。 接下来,我们讨论SQLite数据库。SQLite是一种...

    Content Provider

    接下来,我们探讨如何实现一个简单的Content Provider。以提供的Sample_4_4_ContentProvider为例,假设我们要实现一个存储书籍信息的Content Provider: 1. 定义ContentContract,如`BookContract`,其中包含书籍...

    android 自定义 Content Provider示例

    在Xh_ContentProvider_Test这个压缩包中,可能包含了上述所有代码示例的实现,以及一个测试用例,用于验证Content Provider的功能是否正常。通过运行这个测试用例,你可以了解如何在实际项目中使用自定义的Content ...

    2011.09.07(4)——— android 跨进程通信之content provider

    通过Content Provider,一个应用可以将自己的数据暴露给其他应用,同时也可以访问其他应用公开的数据。这一机制遵循严格的权限控制,确保数据安全。 首先,创建Content Provider需要定义一个继承自`android.content...

    自定义Provider demo

    在提供的"SMS_Gank"文件中,可能包含了一个简单的示例,演示了如何创建一个用于共享短信数据的Content Provider。这个例子可能包含了创建数据库表、处理Uri请求以及如何在其他应用中使用这个Provider的方法。对于...

    android-simple-content-provider-app:简单的Android Content Provider使用示例

    在"android-simple-content-provider-app"中,你可能会发现一个简单的数据模型,比如存储联系人或者任务信息。 1. **创建Content Provider** 要创建Content Provider,你需要创建一个新的Java类并继承自`android....

    content-provider-sample:简单而基本的内容提供者。 如果要使用它,则必须实现Content Resolver

    "content-provider-sample"是一个示例项目,展示了如何创建一个简单的Content Provider。这个项目对于初学者来说,是理解Content Provider工作原理和实现机制的一个很好的起点。下面将详细解释Content Provider以及...

    Android Content Provider详解及示例代码

    例如,创建一个简单的Content Provider用于管理书籍信息: ```java public class MyBookProvider extends ContentProvider { // ... 初始化、URI匹配规则等代码 ... @Override public Cursor query(Uri uri, ...

    Content_Providers

    首先,我们需要创建一个Content Provider类,继承自ContentProvider,并实现其关键方法,如: - onCreate():初始化Content Provider。 - query():处理查询请求,返回Cursor。 - insert():处理插入数据请求。 - ...

    contentProvider 资料

    接下来,可以尝试自己编写一个简单的Content Provider,最后结合实际项目需求,实践Content Provider的高级用法,如跨进程通信和异步数据处理。 9. **应用场景** Content Provider广泛应用于不同应用间的通讯,如...

    浅谈Android Content Provider的使用

    Content Provider作为Android四大组件之一,是Android系统中实现数据共享的关键机制。本文将详细阐述Content Provider的定义、配置、功能以及如何通过Uri进行数据操作,帮助开发者更好地理解和运用这一核心组件。 ...

    FileProvider使用demo

    通过以上步骤,你可以实现一个简单的`FileProvider` demo,如`FileProviderDemo`所示,适配Android 7.0,实现系统拍照和裁剪图片的功能。在实际应用中,还可以根据需求扩展,如支持多种类型的文件,或者在多线程环境...

    Content_Provider_Sample

    这个项目通过提供一个简单的屏幕截图和应用展示,向开发者展示了如何实现和运用Content Provider来分享随机生成的信息。 首先,我们要理解Content Provider的基本概念。Content Provider是Android系统中的一个接口...

    Provider简单demo

    学习这个"Provider简单demo",初学者可以理解`ContentProvider`的基本工作流程,掌握如何创建自己的`ContentProvider`,以及如何在应用间共享数据。实践这部分知识,有助于提升Android开发能力,为后续更复杂的项目...

    contentProviderDemo

    首先,Content Provider是Android系统提供的一种机制,使得应用程序可以将自己的数据暴露给其他应用,或者访问其他应用的数据。这对于数据的跨应用共享至关重要,特别是当数据存储在SQLite数据库或其他私有文件系统...

Global site tag (gtag.js) - Google Analytics