`
Aina_hk55HK
  • 浏览: 388183 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android ContentProviders数据共享

阅读更多
1.创建Content Providers
package com.Aina.Android;

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

/**
 * com.Aina.Android Pro_ContentProviders
 * 
 * @author Aina.huang E-mail: 674023920@qq.com
 * @version 创建时间:2010 Jul 1, 2010 11:26:31 AM 类说明
 */
public class NotePad {

	// Content Providers的URI
	public static final String AUTHORITY = "com.google.android.provider.notepad";

	private NotePad() {

	}

	/**
	 * 定义基本字段
	 * 
	 * @author Aina_hk
	 * 
	 */
	public static final class Notes implements BaseColumns {
		private Notes() {

		}

		public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
				+ "/notes");
		// 新的MIME类型-多个
		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.note";
		// 新的MIME类型-单个
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.note";
		// 默认排序
		public static final String DEFAULT_SORT_ORDER = "modified ASC";
		// 字段
		public static final String TITLE = "title";
		public static final String NOTE = "note";
		public static final String CREATEDDATE = "created";
		public static final String MODIFIEDDATE = "modified";
	}
}



package com.Aina.Android;

import java.util.HashMap;

import com.Aina.Android.NotePad.Notes;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.net.Uri;
import android.text.TextUtils;

/**
 * com.Aina.Android Pro_ContentProviders
 * 
 * @author Aina.huang E-mail: 674023920@qq.com
 * @version 创建时间:2010 Jul 1, 2010 11:55:55 AM 类说明
 */
public class NotePadProvider extends ContentProvider {

	public static final String DATABASE_NAME = "test.db";
	public static final String TABLE_NAME = "notes";
	public static final int VERSION = 1;
	public static final int NOTES = 1;
	public static final int NOTE_ID = 2;
	public static HashMap<String, String> hm = null;
	public static UriMatcher mUriMatcher = null;
	public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME
			+ " (" + Notes._ID + " INTEGER PRIMARY KEY," + Notes.TITLE
			+ " TEXT," + Notes.NOTE + " TEXT," + Notes.CREATEDDATE
			+ " INTEGER," + Notes.MODIFIEDDATE + " INTEGER)";
	private SQLiteDataHelper msdh = null;
	static {
		mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		mUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
		mUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);
		hm = new HashMap<String, String>();
		hm.put(Notes._ID, Notes._ID);
		hm.put(Notes.TITLE, Notes.TITLE);
		hm.put(Notes.NOTE, Notes.NOTE);
		hm.put(Notes.CREATEDDATE, Notes.CREATEDDATE);
		hm.put(Notes.MODIFIEDDATE, Notes.MODIFIEDDATE);
	}

	private static class SQLiteDataHelper extends SQLiteOpenHelper {

		public SQLiteDataHelper(Context context, String name,
				CursorFactory factory, int version) {
			super(context, name, factory, version);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(CREATE_TABLE);

		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
			this.onCreate(db);
		}

	}

	/**
	 * 删除
	 */
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = msdh.getWritableDatabase();
		int num = 0;
		switch (mUriMatcher.match(uri)) {
		case NOTES:
			num = db.delete(TABLE_NAME, selection, selectionArgs);
			break;
		case NOTE_ID:
			num = db.delete(TABLE_NAME, Notes._ID
					+ " = "
					+ uri.getPathSegments().get(1)
					+ (!TextUtils.isEmpty(selection) ? " AND (" + selection
							+ ')' : ""), selectionArgs);
			break;
		default:
			break;
		}
		this.getContext().getContentResolver().notifyChange(uri, null);
		return num;
	}

	@Override
	public String getType(Uri uri) {
		String str = "";
		switch (mUriMatcher.match(uri)) {
		case NOTES:
			str = Notes.CONTENT_TYPE;
			break;
		case NOTE_ID:
			str = Notes.CONTENT_ITEM_TYPE;
			break;
		default:
			throw new IllegalArgumentException("Unknown URI " + uri);
		}
		return str;
	}

	/**
	 * 插入
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		if (mUriMatcher.match(uri) != NOTES) {
			throw new IllegalArgumentException("Unknown URI " + uri);
		}
		ContentValues cv = null;
		if (values == null) {
			cv = new ContentValues();
		} else {
			cv = new ContentValues(values);
		}
		long num = System.currentTimeMillis();
		if (cv.containsKey(Notes.CREATEDDATE) == false) {
			cv.put(Notes.CREATEDDATE, num);
		}
		if (cv.containsKey(Notes.MODIFIEDDATE) == false) {
			cv.put(Notes.MODIFIEDDATE, num);
		}
		if (cv.containsKey(Notes.TITLE) == false) {
			Resources r = Resources.getSystem();
			cv.put(Notes.TITLE, r.getString(android.R.string.untitled));
		}
		if (cv.containsKey(Notes.NOTE) == false) {
			cv.put(Notes.NOTE, "");
		}
		SQLiteDatabase db = msdh.getWritableDatabase();
		long id = db.insertOrThrow(TABLE_NAME, Notes.NOTE, cv);
		if (id > 0) {
			Uri uri_new = ContentUris.withAppendedId(uri, id);
			this.getContext().getContentResolver().notifyChange(uri_new, null);
			return uri_new;
		}
		return null;
	}

	@Override
	public boolean onCreate() {
		msdh = new SQLiteDataHelper(this.getContext(), TABLE_NAME, null,
				VERSION);
		return true;
	}

	/**
	 * 查询
	 */
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		switch (mUriMatcher.match(uri)) {
		case NOTES:
			qb.setTables(TABLE_NAME);
			qb.setProjectionMap(hm);
			break;
		case NOTE_ID:
			qb.setTables(TABLE_NAME);
			qb.setProjectionMap(hm);
			qb.appendWhere(Notes._ID + " = " + uri.getPathSegments().get(1));
			break;
		default:
			throw new IllegalArgumentException("Unknown URI " + uri);
		}
		String orderBy = "";
		if (TextUtils.isEmpty(sortOrder)) {
			orderBy = Notes.DEFAULT_SORT_ORDER;
		} else {
			orderBy = sortOrder;
		}
		SQLiteDatabase db = msdh.getReadableDatabase();
		Cursor cursor = qb.query(db, projection, selection, selectionArgs,
				null, null, orderBy);
		cursor.setNotificationUri(this.getContext().getContentResolver(), uri);
		return cursor;
	}

	/**
	 * 更新
	 */
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase db = msdh.getWritableDatabase();
		int num = 0;
		switch (mUriMatcher.match(uri)) {
		case NOTES:
			num = db.update(TABLE_NAME, values, selection, selectionArgs);
			break;
		case NOTE_ID:
			num = db.update(TABLE_NAME, values, Notes._ID
					+ " = "
					+ uri.getPathSegments().get(1)
					+ (!TextUtils.isEmpty(selection) ? " and (" + selection
							+ ")" : ""), selectionArgs);
		default:
			break;
		}
		this.getContext().getContentResolver().notifyChange(uri, null);
		return num;
	}
}



package com.Aina.Android;

import com.Aina.Android.NotePad.Notes;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class Test extends Activity {
	/** Called when the activity is first created. */
	ListView lv = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		lv = (ListView) this.findViewById(R.id.ListView01);
		ContentValues cv = new ContentValues();
		cv.put(Notes.TITLE, "title1");
		cv.put(Notes.NOTE, "note1");
		this.getContentResolver().insert(Notes.CONTENT_URI, cv);
		cv.clear();
		cv.put(Notes.TITLE, "title2");
		cv.put(Notes.NOTE, "note2");
		this.getContentResolver().insert(Notes.CONTENT_URI, cv);
		this.displayNote();
	}

	private void displayNote() {
		String[] columns = new String[] { Notes._ID, Notes.TITLE, Notes.NOTE,
				Notes.CREATEDDATE, Notes.MODIFIEDDATE };
		Cursor c = this.managedQuery(Notes.CONTENT_URI, columns, null, null,
				null);
		this.startManagingCursor(c);
		if (c != null) {
			int cs = 0;
			
			if(c.isBeforeFirst()){
				cs++;
				this.setTitle("isBeforeFirst"+cs);
			}
			if(c.moveToFirst()){
				cs++;
				this.setTitle("moveToFirst"+cs);
			}
			if(c.isFirst()){
				cs++;
				this.setTitle("isFirst"+cs);
			}
			ListAdapter adapter = new SimpleCursorAdapter(this,
					android.R.layout.simple_list_item_2, c, new String[] {
							Notes._ID, Notes.TITLE }, new int[] {
							android.R.id.text1, android.R.id.text2 });
			lv.setAdapter(adapter);

			/*
			 * if (c.moveToFirst()) { this.setTitle(c.getCount()+""); String id =
			 * ""; String title = ""; do { id =
			 * c.getString(c.getColumnIndex(Notes._ID)); title =
			 * c.getString(c.getColumnIndex(Notes.TITLE)); Toast toast =
			 * Toast.makeText(this, c.getPosition()+"|ID:" + id + "|title:" +
			 * title, Toast.LENGTH_LONG); toast.show(); } while
			 * (c.moveToNext());
			 *  }
			 */
		}
	}
}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.Aina.Android" android:versionCode="1"
	android:versionName="1.0">
	<application android:icon="@drawable/icon"
		android:label="@string/app_name">
		<provider android:name=".NotePadProvider"
			android:readPermission="android.permission.READ_CALENDAR"
			android:writePermission="android.permission.WRITE_CALENDAR"
			android:authorities="com.google.android.provider.notepad" />
		<activity android:name=".Test"
			android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category
					android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
			<intent-filter>
				<data
					android:mimeType="vnd.android.cursor.dir/vnd.google.note">
				</data>
			</intent-filter>
			<intent-filter>
				<data
					android:mimeType="vnd.android.cursor.item/vnd.google.note">
				</data>
			</intent-filter>
		</activity>

	</application>
 

</manifest>



2.通过ContentResolver来操作数据

package com.gn.provide;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class Tess extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		String uri = "content://com.google.android.provider.notepad/xixi";
		String[] columns = new String[] { "_id", "title", "note" };
		try {
			/*添加数据
			ContentValues cv = new ContentValues();
			cv.put("title", "new title");
			cv.put("note", "new note");
			this.getContentResolver().insert(Uri.parse(uri), cv);
			*/
			/*删除数据
			int num = this.getContentResolver().delete(Uri.parse(uri), "title='new title'", null);
			*/
			/*修改
			ContentValues cv = new ContentValues();
			cv.put("title", "old title");
			cv.put("note", "old note");
			long num = this.getContentResolver().update(Uri.parse(uri), cv, "_id=3", null);
			this.setTitle("num="+num);
			*/
			Cursor c = this
					.managedQuery(Uri.parse(uri), null, null, null, null);
			// Cursor c = this.getContentResolver().query(Uri.parse(uri),
			// columns,
			// null, null, null);
			if (c == null) {
				this.setTitle("c=null");
			} else {
				this.startManagingCursor(c);
				ListView lv = (ListView) this.findViewById(R.id.ListView01);
				ListAdapter adapter = new SimpleCursorAdapter(this,
						R.layout.simple, c, columns, new int[] { R.id.ID,
								R.id.title, R.id.note });
				lv.setAdapter(adapter);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	
}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.gn.provide"
      android:versionCode="1"
      android:versionName="1.0">
      <uses-permission android:name="android.permission.READ_CALENDAR"></uses-permission>
      <uses-permission android:name="android.permission.WRITE_CALENDAR"></uses-permission>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Tess"
                  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>


</manifest> 
分享到:
评论

相关推荐

    android contentprovider 数据共享

    ContentProvider(数据提供者)是在应用程序间共享数据的一种接口机制。应用程序在不同的进程中运行,因此,数据和文件在不同应用程序之间是不能够直接访问的。

    ContentProvider数据共享

    下面将详细介绍ContentProvider数据共享的基本使用方法。 1. 创建ContentProvider 要创建一个ContentProvider,你需要继承`android.content.ContentProvider`类,并重写其中的关键方法,如`onCreate()`, `query()`,...

    android 数据共享(ContentProvider)

    在Android系统中,数据共享是应用之间相互交互的重要方式,ContentProvider则是官方推荐的实现这一功能的核心组件。ContentProvider提供了一种标准化的机制,使得不同的应用程序可以安全、有序地访问和共享数据,...

    Android+Room+ContentProvider

    ContentProvider是Android系统中用于数据共享的一种机制,它可以使得应用的数据对其他应用可见并可操作。通过ContentProvider,我们可以实现跨应用的数据交换,比如联系人、日历等系统数据就是通过ContentProvider...

    Android学习 ContentProvider数据更新与Observer模式.doc

    ContentProvider作为Android系统中数据共享的桥梁,允许不同的应用程序之间交换数据,而Observer模式则是一种设计模式,用于实现实时数据同步和更新。 **ContentProvider**是Android框架的一部分,它提供了一种标准...

    Android ContentProvider全面解析

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以将自己的数据结构暴露给其他应用,同时也能够访问其他应用公开的数据。本篇文章将全面解析...

    实验8 contentProvider共享数据1

    实验8的内容主要涉及Android开发中的数据共享机制,具体是通过`ContentProvider`来实现的。`ContentProvider`是Android系统中用于不同应用程序间共享数据的一种核心组件。在本实验中,我们将学习如何创建和使用`...

    疯狂android资料:第九章使用ContentProvider实现数据共享.doc

    ContentProvider 是 Android 中的一种机制,允许不同的应用程序之间进行数据共享。它提供了一种标准的 API,允许应用程序之间交换数据。ContentProvider 也是 Android 应用的四大组件之一,与 Activity、Service、...

    使用contentprovider共享生词本数据

    在Android开发中,ContentProvider是一种重要的组件,它允许应用程序之间共享数据。本篇文章将深入探讨如何使用ContentProvider来共享生词本数据。首先,我们来看看什么是ContentProvider。 ContentProvider是...

    android ContentProvider Demo

    总的来说,ContentProvider是Android平台实现数据共享的关键机制。通过这个Demo,开发者可以学习如何创建自己的ContentProvider,从而在应用间有效地传递和管理数据。理解并掌握ContentProvider的使用,对于开发复杂...

    android 用ContentProvider操作文件

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

    采用ContentProvider对外共享数据

    在Android系统中,ContentProvider是一种核心组件,它扮演着数据共享和交换的重要角色。通过ContentProvider,一个应用程序可以将自己的数据暴露给其他应用访问,同时也能获取到其他应用的数据。本篇将深入探讨如何...

    ContentProvider实现数据共享

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的重要角色。ContentProvider使得应用程序之间能够安全、有序地访问彼此的数据,无论是保存在SQLite数据库中的数据,还是存储在文件系统或者其他...

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

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

    Android ContentProvider简单实现

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和共享数据。本篇文章将详细介绍如何在Android中实现一个简单的ContentProvider。 首先,理解...

    使用ContentProvider共享数据

    在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享和访问数据。"使用ContentProvider共享数据"这个主题涉及到如何构建和使用ContentProvider来开放数据库,以及如何通过ContentResolver来...

    android程序间数据的共享(ContentProvider和ContentResolver的使用)

    在Android系统中,应用程序之间进行数据共享是一种常见的需求。为了实现这一目标,Android提供了一种安全、标准化的方式,即通过ContentProvider和ContentResolver组件。本文将深入探讨这两个组件的工作原理及其在...

    android contentprovider使用示例

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

    Android中ContentProvider的示例

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地交换数据。本示例将深入讲解如何创建和使用ContentProvider。 首先,我们来理解ContentProvider的基本概念...

    ContentProvider 共享SharedPreferences 值

    在Android开发中,数据共享是常见的需求,尤其是在多个应用程序之间。`ContentProvider` 是Android提供的一种机制,允许应用间安全地共享数据。本篇将详细讲解如何利用`ContentProvider`来共享`SharedPreferences`的...

Global site tag (gtag.js) - Google Analytics