`
as11051105
  • 浏览: 60123 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

ContentProvider

阅读更多
ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。并且此种方式忽略了底层的数据存储实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。其步骤为:

  1. 在当前应用程序中定义一个ContentProvider。

  2. 在当前应用程序的AndroidManifest.xml中注册此ContentProvider

  3. 其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据。

  ContentResolver提供了诸如insert(), delete(), query()和update()之类的方法,用于实现对ContentProvider中数据的存取操作。

  Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分:

    A:无法改变的标准前缀,包括;"content://"、"tel://"等。当前缀是"content://"时,说明通过一个Content Provider控制这些数据  

    B:URI的标识,它通过authorities属性声明,用于定义了是哪个ContentProvider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的   类名。例如;"content://com.silent.data.myprovider"  

    C:路径,可以近似的理解为需要操作的数据库中表的名字,如:"content://hx.android.text.myprovider/name"中的name

    D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;

  下面通过是代码示例,演示一下如何在应用之间相互获取数据。

  在应用程序A中,继承ContProvider类,并重写其中方法。

public class MyProvider extends ContentProvider{  
     @Override  
     public int delete(Uri uri, String selection, String[] selectionArgs) {  
         // TODO Auto-generated method stub  
         return 0;  
     }  
   
     @Override  
     public String getType(Uri uri) {  
         // TODO Auto-generated method stub  
         return null;  
     }  
   
     @Override  
     public Uri insert(Uri uri, ContentValues values) {  
         return null;  
     }  
   
     //在Create中初始化一个数据库  
     @Override  
     public boolean onCreate() {  
         SQLiteDatabase db = this.getContext().openOrCreateDatabase("silent.db3", Context.MODE_PRIVATE, null);  
         db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");  
         ContentValues values = new ContentValues();  
         values.put("name", "test");  
         db.insert("tab", "_id", values);  
         db.close();  
         return true;  
     }  
   
     //实现query方法  
     @Override  
     public Cursor query(Uri uri, String[] projection, String selection,  
             String[] selectionArgs, String sortOrder) {  
         SQLiteDatabase db = this.getContext().openOrCreateDatabase("silent.db3", Context.MODE_PRIVATE, null);  
         Cursor c = db.query("tab", null, null, null, null, null,null);  
         return c;  
     }  
   
     @Override  
     public int update(Uri uri, ContentValues values, String selection,  
             String[] selectionArgs) {  
         // TODO Auto-generated method stub  
         return 0;  
     }  
 }  

   在其AndroidManifest.xml中声明此ContentProvider,其中authorities属性定义了此ContentProvider的Uri标识。

<provider android:name=".MyProvider" android:authorities="com.silent.MyProvider"/>  

  在应用程序B中,通过ContentResolver获取程序A的ContentProvider中的数据。
Java代码  
public class MainActivity extends Activity {  
     @Override  
     public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);  
         setContentView(R.layout.main);  
           
         //获取上下文  
         Context ctx = MainActivity.this;  
         //获取ContentResolver对象  
         ContentResolver resolver = ctx.getContentResolver();  
         //获取Uri对象  
         Uri uri = Uri.parse("content://com.silent.MyProvider");  
         //获取数据  
         Cursor c = resolver.query(uri, null, null, null, null);  
         c.moveToFirst();  
         for(int i=0; i<c.getCount(); i++){  
             int index = c.getColumnIndexOrThrow("name");  
             String src = c.getString(index);  
             Log.d("", src);  
             c.moveToNext();  
         }  
     }  
 }  

  以上就是ContentProvider的使用方式,这种存储方式相比SQLite和SharedPreferences,其复杂性是显而易见的,但是在处处可见“云”的今天,程序间的数据交互需求令ContentProvider存储机制变成必不可少的一部分。以上示例代码只是为了展示ContentProvider的使用,所以程序代码中有诸多不合理的地方并未进行处理。
分享到:
评论

相关推荐

    Android+Room+ContentProvider

    在Android应用开发中,数据持久化是一个至关重要的环节,而Android Room和ContentProvider是其中的两个关键组件。本文将深入探讨这两个技术,并结合实际案例,解释如何在Android应用中使用它们来管理和共享SQLite...

    android 用ContentProvider操作文件

    在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享数据,而无需直接访问对方的内部存储。在本教程中,我们将深入探讨如何利用ContentProvider来操作文件,以及其在跨应用数据传输中的作用。 ...

    androdi ContentProvider和Uri详解

    在Android开发中,ContentProvider和Uri是两个至关重要的概念,它们是Android系统中不同应用程序间数据共享和交互的基础。本文将深入探讨这两个组件的工作原理、使用方法以及它们在实际开发中的应用。 首先,我们来...

    两个apk之间广播互相通信及ContentProvider监听数据库的变换

    本教程将深入探讨如何利用Broadcast和ContentProvider实现两个apk之间的通信以及ContentProvider对数据库变更的监听。 首先,我们来理解Broadcast(广播)的概念。Broadcast是Android系统中一种全局的通知机制,...

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    contentprovider

    ContentProvider是Android系统中的四大组件之一,它是Android应用程序间数据共享的主要机制。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在Android的封闭...

    ContentProvider多表创建

    在Android系统中,ContentProvider是实现数据共享和跨应用数据访问的重要组件。它遵循统一的URI(Uniform Resource Identifier)机制,使得不同的应用可以方便地读取和修改存储在ContentProvider中的数据。本教程将...

    ContentProvider使用方法demo

    ContentProvider是Android系统中用于数据共享的一个核心组件,它允许应用程序之间进行数据交换,而无需了解对方的具体实现。本教程将深入讲解ContentProvider的使用方法,包括基础操作、多ContentProvider管理和多表...

    android 自定义 ContentProvider 以及 ContentResolver

    在Android开发中,ContentProvider和ContentResolver是两个关键组件,它们构成了Android系统中不同应用程序间数据共享的基础。本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作...

    安卓学习之ContentProvider初步

    ContentProvider是Android系统中用于数据共享的重要组件,它是不同应用程序之间安全地交换数据的桥梁。当你想要在自己的应用中公开数据,允许其他应用进行访问时,就需要使用ContentProvider。虽然在许多情况下,...

    ContentProvider自定义以及使用系统ContentProvider

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本篇文章将深入探讨如何自定义ContentProvider以及如何使用系统提供的ContentProvider。 ...

    android contentprovider使用示例

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和操作数据。本示例将详细解释如何在Android中使用ContentProvider。 1. **ContentProvider基本...

    ContentProvider 实战源码以及apk

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。本实战源码深入解析了ContentProvider的工作原理及其在实际项目中的应用,通过阅读源码,开发者可以更好地理解如何创建...

    用SharePreferences做ContentProvider

    `SharedPreferences` 和 `ContentProvider` 是两种常见的数据存储和共享机制。本篇文章将深入探讨如何利用 `SharedPreferences` 作为数据存储,并通过实现 `ContentProvider` 来实现不同应用间的数据共享。 `...

    android 创建数据库contentprovider

    在Android系统中,ContentProvider是一种重要的组件,它允许应用程序之间共享数据。`android 创建数据库contentprovider`这个主题主要涉及如何创建一个自定义的ContentProvider来管理数据库中的数据,并实现跨应用的...

    ContentProvider获取系统的图片视频和音频

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作彼此的数据。本篇文章将详细讲解如何使用ContentProvider通过ContentResolver来获取系统的图片...

    contentProvider监听的例子

    在Android开发中,ContentProvider是系统提供的一种数据共享机制,它允许不同的应用之间进行数据交换。ContentProvider基于URI(统一资源标识符)进行操作,通过ContentResolver接口与ContentProvider进行通信。本...

Global site tag (gtag.js) - Google Analytics