`
xinanadu
  • 浏览: 227668 次
  • 性别: 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基础知识05:四大组件之content provider》的示例程序,实现了content provider 的基本功能。

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

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

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

    内容提供者样本 简单内容提供者。 如果要使用它,则必须实现Content Resolver

    AppUpdate-一个简单、轻量、可随意定制 的Android版本更新库 .zip

    框架内部支持中/英文(其他语言只需要在对应的string....如果需要实现自己一套下载过程,只需要继承BaseHttpDownloadManager 并使用listener更新进度public class MyDownload extends BaseHttpDownloadManager {}

    简易宠物蛇源代码

    一个完整的宠物蛇源代码,它可以跟踪手势,也可长大和缩小。通过它可以了解Android的Message机制,Canvas的使用,菜单,简易多点触控及Content Provider的实现。

    Android开发案例驱动教程 配套代码

    11.6 自定义Content Provider实现数据访问 269 11.6.1 编写Content Provider 269 11.6.2 在不同的应用中调用Content Provider 277 11.6.3 重构Content Provider调用 278 本章小结 281 第12章 多媒体 282 12.1 ...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

    OPhone应用开发权威指南(黄晓庆)

    6.4.4 Content Provider更新的通知机制 267 6.4.5 DAO接口及实现 269 6.4.6 在新线程内处理数据 270 6.5 小结 273 第7章 移动多媒体编程 274 7.1 多媒体文件格式与编码 274 7.1.1 多媒体文件格式 274 7.1.2 编码 275...

    (完整)Android手机天气预报项目报告.doc

    Android的开发组Activity、Intent Receiver、Service、Content Provider等,可以实现不同页面之间的跳转;数据的获取和实现与数据库的实时交互; 不同页面和进程间数据的共享。 2.3 数据库设计 本软件中有两部分...

    JAVA上百实例源码以及开源项目

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码...

    android-inventory:适用于Android设备枚举的RESTful实现

    android库存这是一个简单的Android实现,可以跟踪组织内Droid设备的数量。 在2014年10月的一个周末内完成。 我主要是为了了解亚马逊和谷歌保镖的效果而开发的。 有趣的是,谷歌并没有太大的兴趣[谷歌可能正在运行...

    JAVA上百实例源码以及开源项目源代码

    简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...

    Android开发与实践 pdf

    多媒体应用开发,Android数据存储技术,Content Provider实现数据共享,线程与消息处理,Service应用,网络通信技术,综合案例—家庭理财通,课程设计—猜猜鸡蛋放在哪只鞋子里,课程设计—简易涂鸦板。全书每章内容...

    Android手机天气预报项目报告(1).docx

    Android的开发组Activity、Intent Receiver、Service、Content Provider等,可以实现不同页面之间的跳转;数据的获取和实现与数据库的实时交互;不同页面和进程间数据的共享。 2.3 数据库设计 本软件中有两部分数据...

    Android手机天气预报项目报告.docx

    Android的开发组Activity、Intent Receiver、Service、Content Provider等,可以实现不同页面之间的跳转;数据的获取和实现与数据库的实时交互;不同页面和进程间数据的共享。 2.3 数据库设计 本软件中有两部分数据...

Global site tag (gtag.js) - Google Analytics