当前位置: 代码迷 >> Android >> 【Android学习】Android数据的四种存储方式(4)-ContentProvider
  详细解决方案

【Android学习】Android数据的四种存储方式(4)-ContentProvider

热度:164   发布时间:2016-04-28 06:26:02.0
【Android学习】Android数据的四种储存方式(4)--ContentProvider

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

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

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

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

1、开发ContentProvider

开发ContentProvider需要两步:

--开发一个ContentProvider的子类,该子类需要实现query()、insert()、updata()、delete()等方法

--在AndroidManifest.xml文件中注册该ContentProvider,制定android:authorities属性

2、使用ContentResolver调用方法

具体实现代码如下:

在应用程序A中:

package com.ye_yun_lin.contentprovider;import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.content.ContentProvider;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.view.Menu;public class MainActivity 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) {		// TODO Auto-generated method stub		return null;	}	@Override	public boolean onCreate() {		SQLiteDatabase sqLiteDatabase=this.getContext().openOrCreateDatabase("test_provider", Context.MODE_PRIVATE, null);		sqLiteDatabase.execSQL("create table tab(_id integer primary key, name verchar(255))");		ContentValues contentValues=new ContentValues();		contentValues.put("name", "zhangsan");		sqLiteDatabase.insert("tab", "_id", contentValues);		sqLiteDatabase.close();		return true;	}	@Override	public Cursor query(Uri uri, String[] projection, String selection,			String[] selectionArgs, String sortOrder) {		SQLiteDatabase sqLiteDatabase=this.getContext().openOrCreateDatabase("test_provider", Context.MODE_PRIVATE, null);		Cursor cursor=sqLiteDatabase.query("tab", null,null,null,null,null,null);		return cursor;	}	@Override	public int update(Uri uri, ContentValues values, String selection,			String[] selectionArgs) {		// TODO Auto-generated method stub		return 0;	}	}

在AndroidManifest中注册:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.ye_yun_lin.contentprovider"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.ye_yun_lin.contentprovider.MainActivity"            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.ye_yun_lin.contentprovider.MainActivity"            android:authorities="com.ye_yun_lin.contentprovider.MainActivity.pro"            android:exported="true"/>    </application></manifest>

在程序B中调用:

package com.ye_yun_lin.contentresolver;import android.net.Uri;import android.os.Bundle;import android.app.Activity;import android.content.ContentResolver;import android.content.Context;import android.database.Cursor;import android.util.Log;import android.view.Menu;public class MainActivity extends Activity {	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);				//获取上下文		Context ctx = MainActivity.this;		 //获取ContentResolver对象		ContentResolver resolver = ctx.getContentResolver();		 //获取Uri对象		Uri uri = Uri.parse("content://com.ye_yun_lin.contentprovider.MainActivity.pro/");		 //获取数据		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);			System.out.println(src);			c.moveToNext();		}	}}

运行结果如下:



  相关解决方案