项目中突然想用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基础知识05:四大组件之content provider》的示例程序,实现了content provider 的基本功能。
理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。
内容提供者样本 简单内容提供者。 如果要使用它,则必须实现Content Resolver
框架内部支持中/英文(其他语言只需要在对应的string....如果需要实现自己一套下载过程,只需要继承BaseHttpDownloadManager 并使用listener更新进度public class MyDownload extends BaseHttpDownloadManager {}
一个完整的宠物蛇源代码,它可以跟踪手势,也可长大和缩小。通过它可以了解Android的Message机制,Canvas的使用,菜单,简易多点触控及Content Provider的实现。
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 编程基础 4 Android Android Android Android 手机新...
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的开发组Activity、Intent Receiver、Service、Content Provider等,可以实现不同页面之间的跳转;数据的获取和实现与数据库的实时交互; 不同页面和进程间数据的共享。 2.3 数据库设计 本软件中有两部分...
一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码...
android库存这是一个简单的Android实现,可以跟踪组织内Droid设备的数量。 在2014年10月的一个周末内完成。 我主要是为了了解亚马逊和谷歌保镖的效果而开发的。 有趣的是,谷歌并没有太大的兴趣[谷歌可能正在运行...
简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...
多媒体应用开发,Android数据存储技术,Content Provider实现数据共享,线程与消息处理,Service应用,网络通信技术,综合案例—家庭理财通,课程设计—猜猜鸡蛋放在哪只鞋子里,课程设计—简易涂鸦板。全书每章内容...
Android的开发组Activity、Intent Receiver、Service、Content Provider等,可以实现不同页面之间的跳转;数据的获取和实现与数据库的实时交互;不同页面和进程间数据的共享。 2.3 数据库设计 本软件中有两部分数据...
Android的开发组Activity、Intent Receiver、Service、Content Provider等,可以实现不同页面之间的跳转;数据的获取和实现与数据库的实时交互;不同页面和进程间数据的共享。 2.3 数据库设计 本软件中有两部分数据...