ContentProvider概念
– 内容提供者是Android中的四大组件之一;
– 为存储和获取数据提供统一的接口;
– 可以在不同的应用程序之间共享数据;
下面几段代码实现的是创建数据库DB及表account,通过ContentProvide向表中添加数据的小例子;
SQLiteOpenHelper:
public class DbHelper extends SQLiteOpenHelper
{
public DbHelper(Context context)
{
super(context, "DB", null, 1); //创建数据库“DB”;
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("create table account(id integer primary key, name text)"); //创建表account;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
SQLiteDatabase:
public class DbUtil
{
DbHelper dbHelper;
SQLiteDatabase db;
public DbUtil(Context context)
{
dbHelper = new DbHelper(context);
}
private void open() //打开;
{
db = dbHelper.getWritableDatabase();
}
private void close() //关闭;
{
db.close();
}
public long insert(String table, ContentValues values)
{
open();
long code = db.insert(table, null, values); //向表table中插入数据values;
close();
return code;
}
public void query(String table)
{
open();
Cursor cursor = db.rawQuery("select * from account", null);
while(cursor.moveToNext())
{
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println("id=" + id + ", name=" + name);
}
close();
}
}
URI介绍
– 统一资源定位符,Universal Resource Identifier的简称;
–每一个ContentProvider都拥有一个公共的URI,这个URI用于表示所提供的ContentProvider的数据;
– Uri由以下三部分组成:“content://”、数据的路径、标识ID(可选);
– 每一个ContentProvider都拥有一个公共的URI,这个URI用于表示所提供的ContentProvider的数据;
UriMatcher类的介绍
– 用于操作Uri的工具类
UriMatcher类的主要方法
public void addURI (String authority, String path, int code)
注册所需的Uri
public int match (Uri uri) 与uri进行匹配
UriMatcher类的使用
– 初始化UriMatcher类
– 注册所需的Uri
– 与已经注册的Uri进行匹配
ContentProvider主要方法
boolean onCreate() ContentProvider创建后就执行
Uri insert(Uri uri, ContentValues values) 向ContentProvider添加数据
Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs, String sortOrder) 从ContentProvider查询数据
int update(Uri uri, ContentValues values,String selection, String[] selectionArgs)从ContentProvider更新数据
int delete(Uri uri, String selection, String[] selectionArgs)
从ContentProvider删除数据
ContentProvider实现过程
– 定义CONTENT_URI常量
– 定义类继承ContentProvider
– 实现onCreate、insert、query、delete、update、getType方法
– 在清单文件AndroidManifest.xml中声明
自定义ContentProvider步骤
– 创建保存数据的文件或者数据库
– 定义类继承ContentProvider,实现抽象类
– 在清单文件AndroidManifest.xml中注册ContentProvider
public class MyContentValues extends ContentProvider
{
DbUtil dbUtil;
static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //urimatcher用于操作uri的工具类;
final static String AUTHORITY = "com.lu.contentprovider"; //清单文件中的authorities属性值;
final static int URI_ACCOUNT = 1; //account表;
static
{
uriMatcher.addURI(AUTHORITY, "account", URI_ACCOUNT); //注册所需的uri的code;
}
@Override
public boolean onCreate()
{
dbUtil = new DbUtil(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
{
return null;
}
@Override
public String getType(Uri uri)
{
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values)
{
int code = uriMatcher.match(uri); //match,与uri进行匹配;
long l;
switch(code)
{
case URI_ACCOUNT:
l = dbUtil.insert("account", values);
dbUtil.query("account"); //查询插入结果后的account表;
break;
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs)
{
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs)
{
return 0;
}
}
添加系统ContentProvider内容步骤
– 通过getContentResolver获取ContentResolver对象
– 获取ContentResolver的URI标识
– 将添加的内容封装到ContentValues中
– 通ContentResolver对象调用insert方法执行添加操作
查询系统ContentProvider内容步骤
– 通过getContentResolver获取ContentResolver对象
– 获取ContentResolver的URI标识
– 列出想要查询的列
– ContentResolver对象调用query方法执行查询
public class MainActivity extends Activity implements OnClickListener
{
Button user, customer;
ContentResolver resolver;
final static String CONTENT_URI = "content://com.lu.contentprovider/";
String path = "data/data/com.lu.contentprovider/database/DB";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init()
{
user = (Button)findViewById(R.id.button1);
customer = (Button)findViewById(R.id.button2);
user.setOnClickListener(this);
customer.setOnClickListener(this);
resolver = getContentResolver();
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.button1:
ContentValues values = new ContentValues();
values.put("name", "account");
resolver.insert(Uri.parse(CONTENT_URI + "account"), values);
break;
}
}
}
在清单文件中注册:
<provider android:name="com.lu.contentprovider.MyContentValues"
android:authorities="com.lu.contentprovider"
android:exported="true" //true时,其它程序通过此扩展访问>
</provider>