一、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);
}
}