`
艳过留痕
  • 浏览: 39131 次
社区版块
存档分类

ContentProvide 共享数据库 (附源代码)

阅读更多
1、ContentProvider的基本概念
     1> ContentProvider为存储和读取数据提供了统一的接口
     2> 使用ContentProvider,应用程序可以实现数据共享
     3> android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)
2、Uri
     1> 每一个ContentProvider都拥有一个公共的Uri,这个Uri用于表示这个ContentProvider提供的数据
     2> Android所提供的ContentProvider都存放在andriod.provider这个包里面
3、ContentProvider提供的函数
     1> query() 查询
     2> insert() 插入
     3> update() 更新
     4> delete() 删除
   5> getType() 得到数据类型
     6> onCreate() 创建时的回调函数
4、实现ContentProvider的过程
    1> 定义一个COTENT_URI常量
    2> 定义一个类,继承ContentProvider
    3> 实现query(),delete(),update(),insert(),onCreate(),getType()方法
    4> 在AndroidMainfest.xml中申明
下面以两个实例(一个是ContentProvider所在的应用,另一个是使用ContentProvider的应用),说明如何使用ContentProvider
5、ContentProvider所在的应用
package com.zy.namespace;
 
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;

public class MyContentDemo extends Activity {

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.main);
        insertRecord("MyUser");
        insertRecord("YangYuLin");
        displayRecords();
    }

    private void insertRecord(String userName) {
        ContentValues values = new ContentValues();
        values.put(MyUsers.User.USER_NAME, userName);
        getContentResolver().insert(MyUsers.User.CONTENT_URI, values);
    }

    private void displayRecords() {
        String columns[] = new String[] { MyUsers.User._ID,
                MyUsers.User.USER_NAME };
        Uri myUri = MyUsers.User.CONTENT_URI;
        Cursor cur = managedQuery(myUri, columns, null, null, null);
        if (cur.moveToFirst()) {
            String id = null;
            String userName = null;
            do {
                id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));
                userName = cur.getString(cur
                        .getColumnIndex(MyUsers.User.USER_NAME));
//                Toast.makeText(this, id + " " + userName, Toast.LENGTH_LONG)
//                        .show();
                System.out.println("_111id = " + id +", 111user_name = " + userName);
            } while (cur.moveToNext());
        }
    }
}
 

package com.zy.namespace;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;


/*
 * MyContentProvider继承ContentProvider类,实现其insert,update,delete,getType,onCreate等方法
 */
public class MyContentProvider extends ContentProvider {

    //定义一个SQLiteDatabase变量
    private SQLiteDatabase sqlDB;
    //定义一个DatabaseHelper变量
    private DatabaseHelper dbHelper;
    //数据库名
    private static final String DATABASE_NAME = "Users.db";
    //数据库版本
    private static final int DATABASE_VERSION = 1;
    //表名
    private static final String TABLE_NAME = "User";
    //标签
    private static final String TAG = "MyContentProvider";

    /*
     * 定义一个内部类
     * 
     * 这个内部类继承SQLiteOpenHelper类,重写其方法
     */
    public static class DatabaseHelper extends SQLiteOpenHelper {

        //构造方法
        public DatabaseHelper(Context context) {
            //父类构造方法
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        //当第一次创建数据库的时候调用该方法,可以为数据库增加一些表,和初始化一些数据
        @Override
        public void onCreate(SQLiteDatabase db) {
            //在数据库里生成一张表
            db.execSQL("Create table "
                    + TABLE_NAME
                    + "( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);");
        }

        //当更新数据库版本的时候,调用该方法。可以删除,修改表的一些信息
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);

        }

    }

    //这是一个回调函数,当生成所在类的对象时,这个方法被调用,创建一个数据库
    @Override
    public boolean onCreate() {
        dbHelper = new DatabaseHelper(getContext());
        return (dbHelper == null) ? false : true;
    }

    //查询
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        qb.setTables(TABLE_NAME);
        Cursor c = qb.query(db, projection, selection, null, null, null,
                sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;
    }

    //取得类型
    @Override
    public String getType(Uri uri) {
        return null;
    }

    //插入数据
    @Override
    public Uri insert(Uri uri, ContentValues contentvalues) {
        sqlDB = dbHelper.getWritableDatabase();
        long rowId = sqlDB.insert(TABLE_NAME, "", contentvalues);
        if (rowId > 0) {
            Uri rowUri = ContentUris.appendId(
                    MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();
            getContext().getContentResolver().notifyChange(rowUri, null);
            return rowUri;
        }
        throw new SQLException("Failed to insert row into" + uri);
    }

    //删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    //更新数据
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        return 0;
    }

}
 


package com.zy.namespace;

import android.net.Uri;
import android.provider.BaseColumns;

public class MyUsers {
    
    public static final String AUTHORITY = "com.zy.namespace.MyContentProvider";
    
    //BaseColumn类中已经包含了_id字段
    public static final class User implements BaseColumns
    {
        //定义Uri
        public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
        //定义数据表列
        public static final String USER_NAME = "USER_NAME";
    }

}
 



 

package com.z.name;


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.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class CPClientActitity extends Activity {
   
    public static final String AUTHORITY = "com.zy.namespace.MyContentProvider";    
    private Button insertButton = null;
    //访问ContentProvider的Uri
    Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Uri CONTENT_URI1 = Uri.parse("content://com.zy.namespace.MyContentProvider");
        String columns[] = new String[] { "_id","USER_NAME"};
        Cursor c = managedQuery(CONTENT_URI1, columns, null, null, null);
        if (c.moveToFirst()) {
            String id = null;
            String userName = null;
            do {
                id = c.getString(c.getColumnIndex("_id"));
                userName = c.getString(c.getColumnIndex("USER_NAME"));
//                Toast.makeText(this, id + " " + userName, Toast.LENGTH_LONG)
//                        .show();
                System.out.println("_id = " + id +", user_name = " + userName);
            } while (c.moveToNext());
        }
        
    /*    //得到ContentProvider对于表的所有数据,以游标格式保存
        Cursor c = managedQuery(CONTENT_URI,new String[]{"_id","USER_NAME"},null,null,null);
        
        //循环打印ContentProvider的数据
        if(c.moveToFirst())
        {
            String _id = null;
            String user_name = null;
            
            do
            {
                //得到_id列,USER_NAME列
                _id = c.getString(c.getColumnIndex("_id"));
                user_name = c.getString(c.getColumnIndex("USER_NAME"));
                
                System.out.println("_id = " + _id +", user_name = " + user_name);
                
            }while(c.moveToNext());
        }*/
        
        //根据Id得到控件对象
        insertButton = (Button)findViewById(R.id.Insert);
        //给按钮绑定事件监听器
        insertButton.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                
                //得到EditText输入的数据
                String username = ((EditText)findViewById(R.id.userName)).getText().toString();
                //生成一个ContentResolver对象
                ContentResolver cr = getContentResolver();
                //生成一个ContentValues对象
                ContentValues values = new ContentValues();
                //将EditText输入的值,保存到ContentValues对象中
                values.put("USER_NAME", username);                
                //插入数据
                cr.insert(CONTENT_URI, values);
            }
        });
    }
}
 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.zy.namespace"
    android:versionCode="1"
    android:versionName="1.0" >

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <provider
            android:name=".MyContentProvider"
            android:authorities="com.zy.namespace.MyContentProvider" />

        <activity
            android:name=".MyContentDemo"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <uses-sdk android:minSdkVersion="7" />

</manifest>
 
分享到:
评论

相关推荐

    Android使用ContentProvide实现数据共享

    Android使用ContentProvide实现数据共享,源于《疯狂Android讲义》值得学习

    contentprovide

    这个demo,是关于contentprovider的demo,contentprovider是跨进程调用数据的。以前我很不理解这个contentprovider,因此写了一个dmeo和博客加深理解,再次共享这个demo,希望能帮到和我一样的渣渣

    android使用ContentProvide进程通信

    使用contentprovide作为通信的中介,activity获取service发出的信息,同理也可以service获取activity发出的信息

    android contentprovide demo通俗易懂

    android contentprovide demo通俗易懂。增删改查操作,长按删除,实现清空所有数据。

    作业三——contentProvide、http请求和json解析

    此代码为《作业三——contentProvide、http请求和json解析》的示例代码,详情请点击http://blog.csdn.net/qq347198688/article/details/53074291查看,欢迎讨论与交流!

    ContentProvider如何共享数据

    ContentProvider(内容提供者)如何共享数据,有相关代码和配置信息

    contentprovide删除联系人短信

    使用contentprovide查询删除联系人,根据电话号码删除短息

    Android使用ContentProvide实现的建议联系人读取(7.11环境)

    使用Android中的ContentProvider实现的建议的联系人读取,可以查看通话记录,短信详情,以及联系人,使用安卓7.11环境,不同环境可能有兼容性问题

    ContentProviderDemo

    contentProvide 基础知识学习Demo

    ContentProvider

    通过ContentProvide查找和新增联系人

    彩信阅读器

    获取手机彩信,对联系人 进行匹配。通过 contentprovide获得 在 android 平台运行的

    Android面试demo

    Android面试题demo,主要写了关于Sqlite和ContentProvide的简单示例,考试可能会考到

    android 面试题

    3.android 的四大组件是activiey,service,broadcast和contentprovide。 4.java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。 5.android 中service的实现方法是:start...

    Android面试题(详细答案).d

    3.Activity,Broadcast,Service,ContentProvide 4.ObjectInputStream ObjectOutputSteam 5.startService ,bindService 6.onRestart(),onResume(),onPause(),onStop() 7.SharedPreferences存储,文件存储,SQLite...

    Android使用Intent获取联系人信息

    Intent的使用 趁着工作之余,看了一下intent,发现好多知识都已经忘记了,然后自己有重新复习了一遍,在这里做一下笔记,以下...Intent是Activity,Service,BroadCastReceiver这三大组件之间的桥梁,而ContentProvide

    Android学习课件

    Android基础四大组件遗迹其他一些控件

Global site tag (gtag.js) - Google Analytics