ContentProvider的使用(2)
2015-07-24 08:56
726 查看
1,ContentProvider 的使用 :
首先创建:server端(服务器端),他的作用是提供数据存储位置,以及提供接口给客户端进行数据操作;
提供一个数据库:
之后自定义一个ContentProvider:
当然了 ContentProvider是四大主键之一 所以需要注册:
这样 ContentProvider服务端就注册完成了;
2,之后我们写客户端(client端):
这样 就完成了一个自定义的ContentProvider;
首先创建:server端(服务器端),他的作用是提供数据存储位置,以及提供接口给客户端进行数据操作;
提供一个数据库:
public class SqliteHelper extends SQLiteOpenHelper{ private static final String NAME="info.db"; private static final int VERSION =1; public SqliteHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } public SqliteHelper(Context context) { super(context, NAME, null, VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String sql = "create table person(_id integer primary key,name varchar(16),age integer)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub if(newVersion !=oldVersion){ Log.i("==TAG==", "数据库版本发生改变。。。"); } } @Override public void onOpen(SQLiteDatabase db) { // TODO Auto-generated method stub super.onOpen(db); Log.i("==TAG==", "数据库被打开。。。"); } }
之后自定义一个ContentProvider:
package org.qianfeng.contentprovider; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; public class MyContentProvider extends ContentProvider{ private SqliteHelper helper ; private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int QUERY = 1;//查询的返回码 private static final int INSERT = 2;//插入的返回码 private static final int UPDATE = 3;//更新的返回码 private static final int DELETE = 4;//删除的返回码 static { /** * 第一个参数:当前contentprovider的权限设置 * 第二个参数:访问uri的地址 * 第三个参数:如果client端的uri访问当前的地址匹配时的返回码 */ uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "query", QUERY); uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "insert", INSERT); uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "update", UPDATE); uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "delete", DELETE); // String str ="content://org.qianfeng.contentprovider.MyContentProvider/query"; } /** * 提供给当前程序使用 * 当contentprovider创建时 系统回调方法 */ @Override public boolean onCreate() { // TODO Auto-generated method stub //得到SqliteHelper对象 helper = new SqliteHelper(getContext()); return false; } /** * 提供给客户端程序访问使用 * * 作用:查询当前应用程序的数据 返回cursor对象 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub Cursor cursor = null; if(uriMatcher.match(uri)==QUERY){ SQLiteDatabase db = helper.getWritableDatabase(); cursor=db.query("person", null, selection, selectionArgs, null, null, sortOrder); } return cursor; } /** * 返回contentUri的类型 */ @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } /** * 提供给客户端程序使用 * * 作用:向当前应用程序添加数据 返回的是当前插入数据的row的uri对象 */ @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub if(uriMatcher.match(uri)==INSERT){ SQLiteDatabase db = helper.getWritableDatabase(); db.insert("person", null, values); } return null; } /** * 提供给客户端程序使用 * * 作用: 删除当前应用程序的数据 返回的是删除数据row的个数 */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int count =0; if(uriMatcher.match(uri)==DELETE){ SQLiteDatabase db = helper.getWritableDatabase(); count=db.delete("person", selection, selectionArgs); } return count; } /** * 提供给客户端程序使用 * * 作用:更改当前应用程序的数据 返回的是更新数据row的个数 */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int count =0; if(uriMatcher.match(uri)==UPDATE){ SQLiteDatabase db = helper.getWritableDatabase(); count =db.update("person", values, selection, selectionArgs); } return count; } }
当然了 ContentProvider是四大主键之一 所以需要注册:
<provider android:name="org.qianfeng.contentprovider.MyContentProvider" android:authorities="org.qianfeng.contentprovider.MyContentProvider" android:exported="true" > </provider>
这样 ContentProvider服务端就注册完成了;
2,之后我们写客户端(client端):
package org.qianfeng.contentproviderclient; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; import android.view.Menu; import android.view.View; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { private ListView lv; private SimpleCursorAdapter adapter; private ContentResolver contentResolver; private static final String queryPath="content://org.qianfeng.contentprovider.MyContentProvider/query"; private static final String insertPath="content://org.qianfeng.contentprovider.MyContentProvider/insert"; private static final String updatePath="content://org.qianfeng.contentprovider.MyContentProvider/update"; private static final String detelePath="content://org.qianfeng.contentprovider.MyContentProvider/detele"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contentResolver = getContentResolver(); lv = (ListView) findViewById(R.id.lv); Cursor cursor = contentResolver.query(Uri.parse(queryPath), null, null, null, null); adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item, cursor, new String[]{"name","age"}, new int []{R.id.textView1,R.id.textView2}); lv.setAdapter(adapter); } @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 void onclick (View v){ switch (v.getId()) { case R.id.btn_add: insertData(); break; case R.id.btn_update: updateData(); break; case R.id.btn_delete: deleteData(); break; case R.id.btn_query: break; default: break; } } public void insertData(){ ContentValues values = new ContentValues(); values.put("_id", 1); values.put("name", "zhangsan"); values.put("age", 25); contentResolver.insert(Uri.parse(insertPath), values); values = new ContentValues(); values.put("_id", 2); values.put("name", "lisi"); values.put("age", 33); contentResolver.insert(Uri.parse(insertPath), values); } public void updateData(){ ContentValues values=new ContentValues(); values.put("name","赵四"); contentResolver.update(Uri.parse(updatePath), values,"_id=?", new String[]{1+""}); } public void deleteData(){ int count=contentResolver.delete(Uri.parse(detelePath), "_id=?", new String[]{1+""}); if(count>0){ Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show(); } } }
这样 就完成了一个自定义的ContentProvider;
相关文章推荐
- PHP 7.0 升级备注
- 配置内存中OLTP文件组提高性能
- php实现排序算法(一) 冒泡排序 快速排序
- php正则表达式获取内容所有链接
- PHPCMS调用相关
- 基于window下的jenkins php集成环境搭建分享(1)
- ntpdate
- ubuntu9(bt5)下安装TP-LINK TL-WN823N无线网卡驱动(rtl8192cu芯片组)
- php闭包实例
- PHP 安全编程建议
- OX01: Web Speder 入门
- Win7操作系统下搭建FTP服务器
- PHP 数组
- 第二周第四天(解析/过滤文件/找d盘里的所有txt文件/FileInputStream/FileOutputStream/拷贝文件/readLine读取一个文本行/在一个文档里写入内容)
- Num 10 : HDOJ: 题目1093 :A+B for Input-Output Practice (V)
- 当 PHP 遇到 PDF
- PHP的MySQLi函数库的使用 以及 表单的字符编码配置
- 非常好用的两个PHP函数 serialize()和unserialize()
- 如何判断PHP 是线程安全还是非线程安全的
- php多线程thread开发与应用的例子