当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

Android 内容提供者(Content Provider)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 11:12:24

由 yiyohunter 创建,youj 最后一次修改 2016-11-12 Android 内容提供者(Content Provider)内容提供者组件通过请求从一个应用程序向其他的应用程序提供数据。这些请求由类 ContentResolver 的方法来处理。内容提供者可以使用不同的方式来存储数据。数据可以被存放在数据库,文件,甚至是网络。有时候需要在应用程序之间共享数据。这时内容提供者变得非常有用。内容提供者可以让内容集中,必要时可以有多个不同的应用程序来访问。内容提供者的行为和数据库很像。你可以查询,编辑它的内容,使用 insert(), update(), delete() 和 query() 来添加或者删除内容。多数情况下数据被存储在 SQLite 数据库。内容提供者被实现为类 ContentProvider 类的子类。需要实现一系列标准的 API,以便其他的应用程序来执行事务。public class MyApplication extends ContentProvider {}内容URI要查询内容提供者,你需要以如下格式的URI的形式来指定查询字符串:<prefix>://<authority>/<data_type>/<id>以下是URI中各部分的具体说明:部分说明prefix前缀:一直被设置为content://authority授权:指定内容提供者的名称,例如联系人,浏览器等。第三方的内容提供者可以是全名,如:cn.programmer.statusproviderdata_type数据类型:这个表明这个特殊的内容提供者中的数据的类型。例如:你要通过内容提供者Contacts来获取所有的通讯录,数据路径是people,那么URI将是下面这样:content://contacts/peopleid这个指定特定的请求记录。例如:你在内容提供者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,在包cn.uprogrammer.contentprovider 下,并建立空活动。2修改主要活动文件 MainActivity.java 来添加两个新的方法 onClickAddName() 和 onClickRetrieveStudents()。3在包 cn.uprogrammer.contentprovider 下创建新的 Java 文件 StudentsProvider.java 来定义实际的提供者,并关联方法。4使用<provider.../>标签在 AndroidManifest.xml 中注册内容提供者。5修改 res/layout/activity_main.xml 文件的默认内容来包含添加学生记录的简单界面。6无需修改 strings.xml,Android Studio 会注意 strings.xml 文件。7启动 Android 模拟器来运行应用程序,并验证应用程序所做改变的结果。下面是修改的主要活动文件 src/cn.uprogrammer.contentprovider/MainActivity.java 的内容。该文件包含每个基础的生命周期方法。我们添加了两个新的方法,onClickAddName() 和 onClickRetrieveStudents() 来让应用程序处理用户交互。package cn.uprogrammer.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 cn.uprogrammer.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().insert( StudentsProvider.CONTENT_URI, values); Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show(); } public void onClickRetrieveStudents(View view) { // Retrieve student records String URL = "content://com.example.provider.College/students"; Uri students = Uri.parse(URL); Cursor c = managedQuery(students, null, null, null, "name"); if (c.moveToFirst()) { do{ Toast.makeText(this, c.getString(c.getColumnIndex(StudentsProvider._ID)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)), Toast.LENGTH_SHOR

[1] [2] [3] [4]  下一页


Android 内容提供者(Content Provider)