ContentProvider学习笔记

学习了android  ContentProvider ,现做学习笔记,参考了http://blog.sina.com.cn/s/blog_5688414b0100xagp.html的知识概念。

一、ContentProvider基本概念 

1ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的形式来组织数据。

2、使用ContentProvider可以在不同的应用程序之间共享数据。 

3Android为常见的一些数据提供了默认的ContentProvider包括音频、视频、图片和通讯录等  

ContentProvider所提供的函数:query(),insert(),update(),delete(),getType(),onCreate()等。

 二、URI统一资源标识符)的使用方法

为系统的每一个资源给其一个名字,比方说通话记录。

1、每一个ContentProvider都拥有一个公共的URI这个URI用于表示这个ContentProvider所提供的数据。 

2Android所提供的ContentProvider都存放在android.provider包中。 将其分为ABCD4个部分:

Android学习十九:ContentProvider初步

A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"

 BURI的标识,它定义了是哪个ContentProvider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称;"content://hx.android.text.myprovider"

C:路径,通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一

D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;"content://hx.android.text.myprovider/tablename/#"#表示数据id

三、ContentProvider的实现过程

自己实现ContentProvider不常见因为可能不需要和别的应用程序交换数据。使用内置的ContentProvider比较多 

   1、定义一个CONTENT_URI常量,提供了访问ContentProvider的标识符。 

public static final Uri CONTENT_URI = Uri.parse("content://com.example.codelab.transportationprovider");

其中:content是协议

     Com.exmaple.codelab.transportationprovider是类名,包含完整的包名。

Uri.parse将一个字符串转换成Uri类型。

如果Provider包含子表,同样定义包含字表的CONTENT_URI

content://com.example.codelab.transportationprovider/train 
content://com.example.codelab.transportationprovider/air/domestic 
content://com.example.codelab.transportationprovider/air/international

然后定义列,确保里面包含一个_id的列。

   2、定义一个类继承ContentProvider重写query,insert,update,delete,getTypeonCreate方法(以StudentProvider为例,需要在应用包下)。 

publicclass FirstContentProvider extends ContentProvider

先介绍一下ContentProvider用到的UriMatcherUriMatcher的一个重要的函数是match(Uri uri)。这个函数可以匹配Uri,根据传入的不同Uri返回不同的自定义整形值,以表明Uri访问的不同资源的类型。

     这里UriMatcher类型的静态字段是用来匹配传入到ContentProvider中的Uri的类。其构造方法传入的匹配码是使用match()方法匹配根路径时返回的值,这个匹配码可以为一个大于零的数表示匹配根路径或传入-1,即常量UriMatcher.NO_MATCH表示不匹配根路径。addURI()方法是用来增加其他URI匹配路径的,第一个参数传入标识ContentProviderAUTHORITY字符串。第二个参数传入需要匹配的路径,这里的#号为通配符,代表匹配任意数字,另外还可以用*来匹配任意文本。第三个参数必须传入一个大于零的匹配码,用于match()方法对相匹配的URI返回相对应的匹配码。 例如:sMatcher.addURI(com.test.provider.personprovider,person,1);如果match()方法匹配content://com.test.provider.personprovider/person路径,返回匹配码为1

     

/**
 * 
 */
package edu.fjnu.sqlite;

import edu.fjnu.sqlite.service.DBOpenHelper;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

/**
 * @author Kysann
 *
 */
public class StudentProvider extends ContentProvider {
    
	private DBOpenHelper dbOpenHelp = null;
	private static final int STUDENTS = 1;
	private static final int STUDENT = 2;
	private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);//UriMatcher.NO_MATCH 为 -1
    static{
    	MATCHER.addURI("edu.fjnu.providers.studentprovider", "student", STUDENTS);
    	MATCHER.addURI("edu.fjnu.providers.studentprovider", "student/#", STUDENT);
    }
	@Override
	public int delete(Uri uri, String whereClause, String[] whereArgs) {
		SQLiteDatabase db =dbOpenHelp.getWritableDatabase();
		int count = 0;
		switch (MATCHER.match(uri)) {
		case STUDENTS:
			count = db.delete("student", whereClause, whereArgs);
			break;
		case STUDENT:
			long id = ContentUris.parseId(uri);
			String where = "_id=" + id;
			if(whereClause != null && !"".equals(whereClause))
				where = whereClause + "and" + where;
			count = db.delete("student", where, whereArgs);
			break;
		default:
			throw new IllegalArgumentException("Unknow uri :" + uri.toString());
		}
		return count;
	}

	@Override
	public String getType(Uri uri) {
		switch (MATCHER.match(uri)) {
		case STUDENTS:
			return "vnd.android.cursor.dir/student";

		case STUDENT:
			return "vnd.android.cursor.item/student";
			
		default:
			throw new IllegalArgumentException("Unknow uri :" + uri.toString());
		}
		
	}

	/*
	 * uri :content://edu.fjnu.providers.studentprovider/student
	 * 插入一条学生记录
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = dbOpenHelp.getWritableDatabase();
		switch (MATCHER.match(uri)) {
		case STUDENTS:
			long rowId = db.insert("student", "name", values);
			Uri insertUri = ContentUris.withAppendedId(uri, rowId);
			this.getContext().getContentResolver().notifyChange(uri, null);//更改监听
			return insertUri;
			
		default:
			throw new IllegalArgumentException("Unknow uri = " + uri.toString());
		}
		
	}

	@Override
	public boolean onCreate() {
		dbOpenHelp = new DBOpenHelper(this.getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = dbOpenHelp.getReadableDatabase();
		Cursor cursor = null;
		switch (MATCHER.match(uri)) {
		case STUDENTS:
			cursor = db.query("student", projection, selection, selectionArgs, null, null, sortOrder);
			break;
		case STUDENT:
			long id = ContentUris.parseId(uri);
			String where = "_id=" + id; 
			if(selection != null && !"".equals(selection))
				where = selection + "and" + where;
			cursor = db.query("student", projection, where, selectionArgs, null, null, sortOrder);
			break;
		default:
			throw new IllegalArgumentException("Unknow uri : " + uri.toString());
		}
		return cursor;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelp.getWritableDatabase();
		int count = 0;
		
		switch (MATCHER.match(uri)) {
		case STUDENTS:
			count = db.update("student", values, null, null);
			break;
			
		case STUDENT:
			long id = ContentUris.parseId(uri);
			String where = "_id=" + id;
			if(selection != null && !"".equals(selection))
				where = selection + "and" +where;
			count = db.update("student", values, where, selectionArgs);
			break;
			
		default:
			throw new IllegalArgumentException("Unknow uri = " + uri.toString());
		}
		return count;
	}

}



   4、在AndroidManifest.xml当中进行声明。  

        <provider
            android:exported="true"
            android:name="edu.fjnu.sqlite.StudentProvider"
            android:authorities="edu.fjnu.providers.studentprovider">
            
        </provider>


5、在另外一个应用程序中使用ContentProvider中注册监听,使用 用ContentResolver操作。

 public class HelloActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("Hello Android,Hello World");
        setContentView(tv);
        
        Uri insertUri = Uri.parse("content://edu.fjnu.providers.studentprovider/student");
        ContentResolver contentResolver = getContentResolver();
        contentResolver.registerContentObserver(insertUri, true, new Observer(new Handler()));
    }

    private final class Observer extends ContentObserver{ //观察者类

        public Observer(Handler handler) {
            super(handler);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onChange(boolean selfChange) {
            ContentResolver contentResolver = getContentResolver();
            Uri uri = Uri.parse("content://edu.fjnu.providers.studentprovider/student");
            
            Cursor cursor = contentResolver.query(uri, null, null, null, "_id desc");
            while(cursor.moveToNext()){
                //Integer id = cursor.getInt(cursor.getColumnIndex("_id")); 
                String name = cursor.getString(cursor.getColumnIndex("stu_name"));
                //String pwd = cursor.getString(cursor.getColumnIndex("stu_pwd"));
                Toast.makeText(HelloActivity.this, name, Toast.LENGTH_SHORT).show();
                
            }
        }
        
    }


 
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值