一、ContentProvider的概念
ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
1、ContentProvider使用表的形式来组织数据
   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法,且需要复写

public boolean onCreate()
public String getType(Uri uri)
//返回当前Uri的MIME类型,如果该Uri对应的数据可能包括多条记录
//那么MIME类型字符串,就是以vnd.android.dir/开头
//如果该Uri对应的数据只有一条记录,该MIME类型字符串,就是以vnd.android.cursor.item/开头
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
//根据Uri查询出selection指定的条件所匹配的全部记录,同时可以指定查询哪些列,并且以什么方式排列(sortOrder)
public int delete(Uri uri,String selection,String[] selectionArgs)//根据Uri删除selection指定的条件所匹配的全部记录
public Uri insert(Uri uri,ContentValues values)//根据Uri插入Values对应的数据
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)//根据Uri插入Values对应的数据

3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中

开始动手:

首先android四大组件都需要注册,在AndroidManifest.xml进行注册

<provider
android:name=".DateProvider"
android:authorities="se_content_provider"//唯一
android:exported="true"
>

contentprovider匹配涉及到Uri

先记录下什么是Uri

图片来源于网络:

ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

1.操作数据库
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx


如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")//person表名

注意点:

访问另一个程序的数据时,要保证另一个程序是运行的。

package se08.edu.com.example.hxdn.softwareengineeringdate;

import android.content.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

/**
* Created by hxdn on 2015/10/28.
*/
public class DateProvider extends ContentProvider {
public static final int NOTES=1;
public static final int NOTE_ID=2;
public static final String AUTHORITY="se_content_provider";
public static final String TABLE_NAME="txl";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);
public static UriMatcher sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
private DatabaseHelper databaseHelper;
private SQLiteDatabase db;
static
{
sUriMatcher.addURI(AUTHORITY,TABLE_NAME,NOTES);
sUriMatcher.addURI(AUTHORITY,TABLE_NAME+"/#",NOTE_ID);
}
@Override
public boolean onCreate()//在ContentProvider创建后被调用
{
databaseHelper=new DatabaseHelper(getContext());
return true;
}
@Override
public String getType(Uri uri)
//返回当前Uri的MIME类型,如果该Uri对应的数据可能包括多条记录
//那么MIME类型字符串,就是以vnd.android.dir/开头
//如果该Uri对应的数据只有一条记录,该MIME类型字符串,就是以vnd.android.cursor.item/开头
{
return null;
}
@Override
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
//根据Uri查询出selection指定的条件所匹配的全部记录,同时可以指定查询哪些列,并且以什么方式排列(sortOrder)
{
Log.i("AAA","sada");
db=databaseHelper.getReadableDatabase();
Cursor cursor=null;
switch (sUriMatcher.match(uri))
{
case NOTES:
break;
case NOTE_ID:
Log.i("AAA","草2");
cursor=db.rawQuery("select * from txl",null);
break;
default:
Log.i("AAA","无匹配");
}
return cursor;
}
@Override
public int delete(Uri uri,String selection,String[] selectionArgs)//根据Uri删除selection指定的条件所匹配的全部记录
{
return 0;
}

@Override
public Uri insert(Uri uri,ContentValues values)//根据Uri插入Values对应的数据
{
return null;
}


@Override//根据Uri插入Values对应的数据
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)
{
return 0;
}
}

另一个程序:

package edu.se08.duan_xin;

import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri=Uri.parse("content://se_content_provider/txl/20");
Cursor cursor=getContentResolver().query(uri, null, null, null, null);
Log.i("AAA", cursor.getCount() + "记录数");
while (cursor!=null&&cursor.moveToNext())
{
Log.i("AAA",cursor.getCount()+"记录数");
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. android中SQLite的操作
  4. 匹配联系人采用的是7位还是11位匹配
  5. Android中ExpandableListView的用法
  6. android下前端开发诡异bug记录&解决方法
  7. 记录android应用程序使用的次数 android学习(五)
  8. android AChartEngine学习
  9. 解析Android中string-array数据源的简单使用

随机推荐

  1. 在Android中使用Lombok减少编码
  2. Android 实现程序开机自启动
  3. Live Templates For Android
  4. SQLite in Android
  5. android 获取屏幕的大小
  6. Android ScrollViewy与HorizontalScrollV
  7. Android 安装常见问题列表
  8. Android原生AlertDialog使用总结
  9. android 亮屏及屏幕解锁代码
  10. 自学android——AutoCompleteTextView的