内容URI
要查询内容提供者,你需要以如下格式的URI的形式来指定查询字符串:
<prefix>://<authority>/<data_type>/<id>
以下是URI中各部分的具体说明:
部分 | 说明 |
---|---|
prefix | 前缀:一直被设置为content:// |
authority | 授权:指定内容提供者的名称,例如联系人,浏览器等。第三方的内容提供者可以是全名,如:cn.programmer.statusprovider |
data_type | 数据类型:这个表明这个特殊的内容提供者中的数据的类型。例如:你要通过内容提供者Contacts来获取所有的通讯录,数据路径是people,那么URI将是下面这样:content://contacts/people |
id | 这个指定特定的请求记录。例如:你在内容提供者Contacts中查找联系人的ID号为5,那么URI看起来是这样:content://contacts/people/5 |
创建内容提供者
这里描述创建自己的内容提供者的简单步骤。
- 首先,你需要继承类 ContentProviderbase 来创建一个内容提供者类。
- 其次,你需要定义用于访问内容的你的内容提供者URI地址。
- 接下来,你需要创建数据库来保存内容。通常,Android 使用 SQLite 数据库,并在框架中重写 onCreate() 方法来使用 SQLiteOpenHelper 的方法创建或者打开提供者的数据库。当你的应用程序被启动,它的每个内容提供者的 onCreate() 方法将在应用程序主线程中被调用。
- 最后,使用<provider.../>标签在 AndroidManifest.xml 中注册内容提供者。
以下是让你的内容提供者正常工作,你需要在类 ContentProvider 中重写的一些方法:
- onCreate():当提供者被启动时调用。
- query():该方法从客户端接受请求。结果是返回指针(Cursor)对象。
- insert():该方法向内容提供者插入新的记录。
- delete():该方法从内容提供者中删除已存在的记录。
- update():该方法更新内容提供者中已存在的记录。
- getType():该方法为给定的URI返回元数据类型。
实例
该实例解释如何创建自己的内容提供者。让我们按照下面的步骤:
步骤 | 描述 |
---|---|
1 | 使用 Android Studio 创建 Android 应用程序并命名为 Content Provider,在包com.runoob.contentprovider 下,并建立空活动。 |
2 | 修改主要活动文件 MainActivity.java 来添加两个新的方法 onClickAddName() 和 onClickRetrieveStudents()。 |
3 | 在包 com.runoob.contentprovider 下创建新的 Java 文件 StudentsProvider.java 来定义实际的提供者,并关联方法。 |
4 | 使用<provider.../>标签在 AndroidManifest.xml 中注册内容提供者。 |
5 | 修改 res/layout/activity_main.xml 文件的默认内容来包含添加学生记录的简单界面。 |
6 | 无需修改 strings.xml,Android Studio 会注意 strings.xml 文件。 |
7 | 启动 Android 模拟器来运行应用程序,并验证应用程序所做改变的结果。 |
下面是修改的主要活动文件 src/com.runoob.contentprovider/MainActivity.java 的内容。该文件包含每个基础的生命周期方法。我们添加了两个新的方法,onClickAddName() 和 onClickRetrieveStudents() 来让应用程序处理用户交互。
package com.runoob.contentprovider;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.runoob.contentprovider.R;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
public void onClickAddName(View view) {
// Add a new student record
ContentValues values = new ContentValues();
values.put(StudentsProvider.NAME,
((EditText)findViewById(R.id.editText2)).getText().toString());
values.put(StudentsProvider.GRADE,
((EditText)findViewById(R.id.editText3)).getText().toString());
Uri uri = getContentResolver().