来自:http://www.apkbus.com/android-16352-1-1.html
在自己的android应用中存储数据,可以用SQLite数据库。不过,如果需要在多个应用中共享数据,在Android中,只有通过Content provider机制。
下面用一个最简单(不完整)的示例来说明Content Provider的创建。在界面中使用这个示例显示的效果:
显示帝王姓名、登基年份和朝代。
在这个简单示例中,包括两部分:
- 创建一个Content Provider;
- 使用这个Content Provider(目前是在同一个应用中,可以在其他应用中以相同方式调用)。
创建一个简陋的Content Provider
content provider通过抽象一致的接口,供其他开发者使用Content provider,而实现Content provider,既可以用sqlite3这样的android内置数据库,也可以使用文件系统,甚至可以自己写其他的实现,只要实现规定的接口即可。
实现一个Content provider,需要做:
- 继承ContentProvider,实现该类的几个抽象方法;
- 在manifest文件中声明这个Content provider。
实现的Content provider代码:
- package com.easymorse.cp;
-
- import android.content.ContentProvider;
- import android.content.ContentValues;
- import android.content.Context;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteStatement;
- import android.net.Uri;
-
- public class MyContentProvider extends ContentProvider {
-
- public static final Uri CONTENT_URI = Uri.parse("content://com.easymorse.cp.mycp");
-
- public static final String _ID = "id";
-
- public static final String NAME = "name";
-
- public static final String DYNASTY = "dynasty";
-
- public static final String START_YEAR = "start_year";
-
- private static SQLiteDatabase database;
-
- private static void createTablesIfNotExists() {
- database.execSQL("create table if not exists emperors("
- + " id integer primary key autoincrement," + " name text,"
- + "dynasty text," + "start_year text" + ");");
-
- SQLiteStatement statement = database
- .compileStatement("insert into emperors(name,dynasty,start_year) values(?,?,?)");
- int index = 1;
- statement.bindString(index++, "朱元璋");
- statement.bindString(index++, "明");
- statement.bindString(index++, "1398");
- statement.execute();
-
- index = 1;
- statement.bindString(index++, "玄烨");
- statement.bindString(index++, "清");
- statement.bindString(index++, "1722");
- statement.execute();
-
- statement.close();
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- return 0;
- }
-
- @Override
- public String getType(Uri uri) {
- return null;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues contentValues) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public boolean onCreate() {
- if (database == null) {
- database = this.getContext().openOrCreateDatabase("emperors",
- Context.MODE_PRIVATE, null);
- createTablesIfNotExists();
- }
- return database != null;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- Cursor cursor = database.rawQuery("select * from emperors", null);
- return cursor;
- }
-
- @Override
- public int update(Uri uri, ContentValues contentValues, String selection,
- String[] selectionArgs) {
- // TODO Auto-generated method stub
- return 0;
- }
-
- }
复制代码
需要实现的方法是:
- query() <<
- insert()
- update()
- delete()
- getType()
- onCreate()<<
复制代码
在本例中值实现了标注<<的方法。onCreate方法是创建Content provider时,android调用的。创建Content provider时,本例检查是否创建emperors表,没有就创建一个,并且插入了2条记录。query方法实现的很简单,只是返回表的所有结果集。做完这些还不够,还需要声明一些常量:
- public static final Uri CONTENT_URI = Uri.parse("content://com.easymorse.cp.mycp");
-
- public static final String _ID = "id";
-
- public static final String NAME = "name";
-
- public static final String DYNASTY = "dynasty";
-
- public static final String START_YEAR = "start_year";
复制代码
CONTENT_URI 是便于Content provider使用者引用的,下面使用Content provider的时候能看到。另外,要有一个_ID常量,值是具体表的id列名称。其他几个常量是表中列的对应名称常量。目前没有真的使用。在manifest文件中的声明:
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".UseContactActivity" android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <provider android:name="com.easymorse.cp.MyContentProvider"
- android:authorities="com.easymorse.cp.mycp"></provider>
- </application>
复制代码
这里的android:name是ContentProvider实现类的类名,android:authorities是CONTENT_URI的值。使用创建的Content Provider代码在一个Activity中,通过TextView显示出emperors表中的数据:
- package com.easymorse.cp;
-
- import android.app.Activity;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.widget.TextView;
-
- public class UseContactActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- TextView textView = new TextView(this);
- textView.setText(getContentProviderValues());
- this.setContentView(textView);
- }
-
- private String getContentProviderValues() {
- StringBuilder builder = new StringBuilder();
-
- Cursor cursor = managedQuery(MyContentProvider.CONTENT_URI, null, null,
- null, null);
- while (cursor.moveToNext()) {
- builder
- .append(
- cursor.getString(cursor
- .getColumnIndex(MyContentProvider.NAME)))
- .append(" | ")
- .append(
- cursor
- .getString(cursor
- .getColumnIndex(MyContentProvider.START_YEAR)))
- .append(" | ")
- .append(
- cursor.getString(cursor
- .getColumnIndex(MyContentProvider.DYNASTY)))
- .append("\n");
- }
-
- return builder.toString();
- }
- }
复制代码
主要方法是getContentProviderValues()。通过managedQuery()方法获取到Cursor对象。在方法调用的参数,只用到了MyContentProvider.CONTENT_URI,通过这个参数,android可定位到具体的ContentProvider并启动它(如果没有启动的话)。后面几个参数类似SQL的SELECT子句、WHERE子句和ORDER BY子句。都不写,将返回全部的结果(其实我这个例子中的Content provider也只实现了返回全部结果的逻辑)。源代码见:
<ignore_js_op style="word-wrap: break-word; "> Content Provider安卓巴士(源代码).rar (48.5 KB, 下载次数: 99)
分享到:
相关推荐
博文《android基础知识05:四大组件之content provider》的示例程序,实现了content provider 的基本功能。
理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。
Content Provider获取联系人和图片,博客链接:http://write.blog.csdn.net/postedit/43950781
content_provider_demo, provide data to other app, use cursorLoader to update view
四大组件 Activity Service content provider broadcast receiver
content provider实现数据共享demo(内有两个项目)
NULL 博文链接:https://kevinlynx.iteye.com/blog/857721
Android Content Provider Demo
Android Content Provider用法样例,解析如何使用“内容提供商”Content Provider共享不同应用的数据,本Android例子将使用Content Provider实现了获取联系人信息,里面的注释非常丰富,是学习android的好资料。
1、什么是内容提供者 2、怎样创建内容提供者 3、通过内容提供者完成CRUD操作 4、访问内容提供者 5、监听内容提供者数据变化 6、两个案例:监听短信以及操作联系人 最最重要的是包含了源码
android content provider学习过程中的笔记,希望对大家有帮助。
content provider和sqlite的详细介绍以及用法。。很好的资源,我自己整理的,相当有用,大家可以看看哈。。
这是使用Content Provider案例源码,详细讲解请移步http://blog.csdn.net/wei_zhi/article/details/52960073
Content Provider详解
NULL 博文链接:https://dampce032.iteye.com/blog/975663
关于Content Providers Content Providers 是所有应用程序之间数据存储和检索的一个桥梁,作用是使得各个...把18.SQLite和22.22.Content Provider添加到项目中,先运行18.SQLite,然后在进行22.Content Provider测试
简答的介绍了android中的content provider的用法比较适合刚入门的朋友们学习,希望看过后能够留下你所得的新的。谢谢
NULL 博文链接:https://zhangjiangxing-gmail-com.iteye.com/blog/1743648
content provider源码
自定义Content Provider,实现数据共享。