您的位置:首页 > 编程语言 > PHP开发

contentProvider_内容提供者

2015-08-02 18:00 731 查看
1、ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider

2、ContentProvider提供的方法

   query:查询

   insert:插入

   update:更新

   delete:删除

   getType:得到数据类型

   onCreate:创建数据时调用的回调函数

3、自定义一个ContentProvider,来实现内部原理

  步骤:

  1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)

  public static String SS = "testprovader.user";

        public static Uri CONTENT_USER_URI =Uri.parse("content://"+SS);

  如果有子表,URI为:

  Public static final Uri CONTENT_URI = Uri.parse("content://testprovader.user/users");

  2、定义一个类,继承ContentProvider

  Public class MyContentProvider extends ContentProvider

  3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)

  package com.WangWeiDa.cp;

<p>public class TestContentProvider extends ContentProvider {
 public static String SS = "testprovader.user";
 public static Uri CONTENT_USER_URI =Uri.parse("content://"+SS);
 private static final String TABLE_NAME="User";
 SqlDataBaseHelper content;
 SQLiteDatabase db;
 public boolean onCreate() {
  content = new SqlDataBaseHelper(getContext());
  db = content.getReadableDatabase();
  return false;
 }</p><p> public Cursor query(Uri uri, String[] projection, String selection,
  String[] selectionArgs, String sortOrder) {
  SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        SQLiteDatabase db = content.getReadableDatabase();
        qb.setTables(TABLE_NAME);
        Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
 }</p><p> public String getType(Uri uri) {</p><p>  return null;
 }</p><p> public Uri insert(Uri uri, ContentValues values) {
  db.insert(MySQLPackaging.User.TABLE, null, values);</p><p>  return null;
 }</p><p> public int delete(Uri uri, String selection, String[] selectionArgs) {</p><p>  return 0;
 }</p><p> public int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {</p><p>  return 0;
 }</p><p> /**
  * 创建数据库和表,字段,属性
  */
 public class SqlDataBaseHelper extends SQLiteOpenHelper {
  public static final String DATA_BASE_NAME = "test_provider.db";
  public static final int VERSION = 1;</p><p>  public SqlDataBaseHelper(Context context) {
   super(context, DATA_BASE_NAME, null, VERSION);</p><p>  }</p><p>  public void onCreate(SQLiteDatabase db) {
   String sql = "create table " + MySQLPackaging.User.TABLE + "("
     + MySQLPackaging.User._ID
     + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
     + MySQLPackaging.User.NAME + " TEXT NOT NULL,"
     + MySQLPackaging.User.PASSWORD + " TEXT NOT NULL)";
   db.execSQL(sql);
  }</p><p>  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {</p><p>  }</p><p> }
}
XML里面也要对应:</p>
创建数据库和表,字段,属性,用的这个类定义:
<provider
android:name="com.example.testone017.contentprovider.TestContentProvider"
android:authorities="testprovader.user" />
public class MySQLPackaging {
public static final class Student implements BaseColumns {
public static String TABLE = "student";// 版本1
public static String NAME = "name";// 版本1
public static String NUMBER = "number";// 版本1
public static String SEX = "sex";// 版本1
public static String SCORE = "score";// 版本2升级加入字段
public static String ADDRESS = "address";// 版本3升级加入字段
}

调用者ContentResoler是通过一个Uri来找到相应的ContentProvider的来进行实际操作。但是实际上是用 ContentResolver去操作:

 ContentResolver resolver = getContentResolver(); 

 

/**
* 读取联系人
*/
public void readResolver(ContentResolver resolver) {
Cursor cur = resolver.query(Contacts.People.CONTENT_URI, null, null,
null, null);
while (cur.moveToNext()) {
String name = cur.getString(cur
.getColumnIndex(Contacts.People.NAME));
int n = cur.getInt(cur.getColumnIndex(Contacts.People.NOTES));

Log.i("11", "name :" + name + "号码 :" + n);
}
}

/**
* 添加联系人
*/
public void insertRasolver(ContentResolver resolver) {
ContentValues values = new ContentValues();
values.put(Contacts.People.NAME, "穿着拖鞋去上学");
values.put(Contacts.People.NOTES, 10086111);

Uri uri = Contacts.People.CONTENT_URI;
resolver.insert(uri, values);
}
//查询:
public final Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder);
//新增
public final Uri insert(Uri url, ContentValues values)
//更新
public final int update(Uri uri, ContentValues values, String where,
String[] selectionArgs)
//删除
public final int delete(Uri url, String where, String[] selectionArgs)

以上操作实际是通过Uri来匹配ContentProvider, 再由ContentProvider来进行具体操作的。
操作的参数和操作sqlite各函数的参数意义是一样的。


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: