`
he91_com
  • 浏览: 400998 次
文章分类
社区版块
存档分类
最新评论

Android 四大组件之 ContentProvider

 
阅读更多

简介

简而言之,ContentProvider 向别的应用程序提供数据(联系人这个应用程序提供了 它的 ContentProvider),ContentResolver 从别的应用程序(已提供ContentProvider)获取、修改、添加数据(我们可以通过ContentResolver 来操纵联系人中的数据)。

说明

既然是四大组件之一,那么创建步骤基本相同
1: 自定义 ContentProvider
2: 注册
3: 使用

1自定义ContentProvider

MyProvider.java

package com.myprovider;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MyProvider extends ContentProvider{
    DatabaseHelper dbhelper;
    SQLiteDatabase db;
    
    UriMatcher UMatcher=new UriMatcher(UriMatcher.NO_MATCH);
    
    @Override
    public boolean onCreate() {
        // TODO 自动生成的方法存根
        dbhelper=new DatabaseHelper(getContext(), "michael", null, 1);
        
        UMatcher.addURI("com.michael", "michael", 1);
        UMatcher.addURI("com.michael", "michael/#", 2);
        db=dbhelper.getWritableDatabase();
        return true;
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        // TODO 自动生成的方法存根
        Cursor cursor;
        
        switch(UMatcher.match(uri))
        {
        case 1:
            cursor= db.query("michael", projection, selection, selectionArgs, null, null, sortOrder);
            break;
        case 2:
            long id=ContentUris.parseId(uri);
            String myselection="_id="+id;
            
            if(selection!=null)
                myselection +=selection;    
            
            cursor =db.query("michael", projection, myselection, selectionArgs, null, null, sortOrder);
            break;
        default:
            //非法的参数异常
            throw new IllegalArgumentException("unknow uri" + uri.toString());
        }
        return cursor;
    }
    @Override
    public String getType(Uri uri) {
        // TODO 自动生成的方法存根
        return null;
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO 自动生成的方法存根
        long id =db.insert("michael", "username", values);
        return ContentUris.withAppendedId(uri, id);
    }
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO 自动生成的方法存根
        int num;
        switch(UMatcher.match(uri))
        {
        case 1:
            num=db.delete("michael", selection, selectionArgs);
            break;
        case 2:
            long id=ContentUris.parseId(uri);
            String myselection="_id="+id;
            
            if(selection!=null)
                myselection +=selection;
            
            num= db.delete("michael", myselection, selectionArgs);
            break;
        default:
            //非法的参数异常
            throw new IllegalArgumentException("unknow uri" + uri.toString());
        }
        return num;
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        // TODO 自动生成的方法存根
        int num;
        
        switch(UMatcher.match(uri))
        {
        case 1:
            num=db.update("michael", values, selection, selectionArgs);
            break;
        case 2:
            long id=ContentUris.parseId(uri);
            String myselection="_id="+id;
            
            if(selection!=null)
                myselection +=selection;
            num=db.update("michael", values, myselection, selectionArgs);
            break;
        default:
            //非法的参数异常
            throw new IllegalArgumentException("unknow uri" + uri.toString());
        }
        return num;
    }
}

2封装的 SQLiteOpenHelper 用以操作数据库

DatabaseHelper.java

package com.myprovider;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
    public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建数据库
        db.execSQL("create table michael(_id integer primary key autoincrement ,username text);");
        
        //初始数据
        ContentValues values=new ContentValues();
        values.put("username", "张三");
        db.insert("michael", "username", values);
        values.put("username", "李四");
        db.insert("michael", "username", values);
        values.put("username", "王五");
        db.insert("michael", "username", values);
        values.put("username", "赵六");
        db.insert("michael", "username", values);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //升级数据库
        db.execSQL("drop table if exists michael;");
        this.onCreate(db);
    }
}

3注册

AndroidManifest.xml

<provider
    android:name="com.myprovider.MyProvider"
    android:authorities="com.michael"
    android:exported="true"/>

4访问数据(在别的应用程序中亦同)

意思是,你新建一个项目,具备如下代码,仍然能操作访问 上述项目中的数据。 这就是 ContentProvider 的神奇之处 :)

4.1 MainActivity.java

package com.myprovider;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ContentResolver resolver=this.getContentResolver();
        Uri uri=Uri.parse("content://com.michael/michael");
        ContentValues values=new ContentValues();
        values.put("username", "霸王龙");
        resolver.insert(uri, values);
        values.put("username", "巨无霸");
        resolver.insert(uri, values);
        values.put("username", "擎天柱");
        resolver.insert(uri, values);
        values.put("username", "大黄蜂");
        resolver.insert(uri, values);
        
        Cursor cursor=resolver.query(uri, new String[]{"_id","username"}, null, null, null);
        SimpleCursorAdapter adapter=new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, new String[]{"_id","username"}, new int[]{android.R.id.text1,android.R.id.text2}, 0);
    
        ListView listview=(ListView)findViewById(R.id.listview);
        listview.setAdapter(adapter);
    }
}

4.2 activity_main.xml 布局文件

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

5效果截图


转载请注明出处,毕竟代码是一个一个敲出来的 :)
分享到:
评论

相关推荐

    Android四大组件之ContentProvider(二)

    在Android应用开发中,四大组件是Activity、Service、...通过阅读《Android四大组件之ContentProvider(二)》这篇博客,开发者可以更深入地了解ContentProvider的工作原理和实践技巧,从而在实际项目中灵活运用。

    Android四大组件之ContentProvider:简单的通讯录查询和添加

    在Android系统中,四大组件是应用程序的核心组成部分,包括Activity、Service、BroadcastReceiver和ContentProvider。ContentProvider作为数据共享和交互的桥梁,使得不同应用之间能够安全地访问和操作私有数据。...

    Android四大组件简述

    在"Android四大组件简述"这个项目中,你可以找到关于这些组件的示例代码和实践应用,通过学习和调试这些示例,可以更深入地理解四大组件的工作原理和使用方式。这将对提升你的Android开发技能大有裨益。

    Android四大组件ContentProvider

    在Android系统中,四大组件是Activity、Service、BroadcastReceiver以及我们关注的ContentProvider。ContentProvider是Android框架中用于数据共享和跨应用数据访问的核心组件。它允许一个应用程序将自己的数据暴露给...

    Android四大组件之一ContentProvider自定义Sqlite共享,实现增删查改基本功能

    在Android开发中,ContentProvider是四大核心组件之一,它扮演着数据共享与访问的重要角色。ContentProvider使得应用程序间的数据共享成为可能,同时也为其他组件(如Activity、Service)提供了统一的接口来操作数据...

    Android四大核心组件之ContentProvider的简单用法以及报错解决

    之前在用到ContentProvider时也是在网上找的教程,但是按照那些做法不怎么全面,我是没有实现出来,并且对于报错也没有给出解释原因与解决办法,也是通过借鉴与自己摸索,将自己 的一点想法分享出来。包含 ...

    android四大组件详解

    在Android系统中,四大组件是构建应用程序的核心元素,它们分别是Activity、Service、BroadcastReceiver和Content Provider。这四个组件各自承担着不同的职责,共同构成了Android应用的骨架。 **Activity**是用户与...

    四,android四大组件基础介绍及打电话,发短信简单应用 &单元测试

    在Android开发中,四大组件是构建应用程序的核心元素,它们分别是:Activity、Service、BroadcastReceiver以及ContentProvider。这四个组件各自承担着不同的职责,是Android系统交互的基础。 1. **Activity**: ...

    09_四大应用组件之ContentProvider.zip

    在Android开发中,四大应用组件是Activity、Service、BroadcastReceiver以及我们关注的ContentProvider。ContentProvider作为其中之一,扮演着数据共享和跨应用数据访问的重要角色。这篇教程将深入解析...

    Android开发的四大组件

    在Android应用开发中,四大组件是构建应用程序的基础,它们分别是Activity、Service、BroadcastReceiver和ContentProvider,还有Intent作为组件间通信的重要桥梁。下面我们将逐一详细解释这些组件。 **Activity详解...

    android 四大组件图解 ppt形式展示

    在Android应用开发中,四大组件是其核心构造块,它们分别是Activity、Service、BroadcastReceiver以及ContentProvider。这个名为“Android 四大组件图解”的PPT文档为初学者提供了一个全面且直观的理解这些组件的...

    android 来电拦截,手机黑名单的实现,涵盖Android四大组件,

    首先,让我们来看看Android四大组件: 1. **活动(Activity)**:这是用户与应用交互的主要接口,通常用于显示UI。在来电拦截的场景中,活动可能用于设置黑名单,展示拦截规则或者处理用户的相关操作。 2. **服务...

    android 用ContentProvider操作文件

    1. ContentProvider概述:ContentProvider是Android四大组件之一,它的主要职责是管理应用内的数据并提供对外接口,让其他应用能够通过URI(统一资源标识符)来访问这些数据。这对于文件操作来说尤其有用,因为这样...

    Android四大组件(笔记+代码)

    在Android开发中,四大组件是构建应用...以上就是关于Android四大组件中的ContentProvider和SharedPreferences的基本使用,以及如何插入短信的相关知识。理解并熟练掌握这些内容,对于进行Android应用开发至关重要。

    Android 四大组件详解(一) Activity 提到的demo

    在Android应用开发中,四大组件是应用程序的核心组成部分,它们包括Activity、Service、BroadcastReceiver和ContentProvider。本篇文章将重点解析Activity,尤其是其启动模式。Activity是用户与应用程序交互的窗口,...

    Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作

    接下来,ContentProvider是Android四大组件之一,它提供了一种标准接口,使得其他应用程序可以访问和修改由ContentProvider管理的数据,无论这些数据是存储在SQLite数据库、文件系统还是网络中。要创建一个...

    Android 之 自定义ContentProvider的使用

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在...

Global site tag (gtag.js) - Google Analytics