Android Custom ContentProvider Demo

 廣大博友,看過後幫忙頂頂,謝謝大家!!!

 轉載請註明:http://blog.csdn.net/richway2010/article/details/6600835

【博主:各位博友,網友們,大家網上好!歡迎光臨本博客。 歡迎多多交流,多提意見,互相學習,互相進步,我們的口號是:好好學習,天天向上。】


    Content Provider 屬於Android應用程序的組件之一,作爲應用程序之間唯一的共享數據的途徑,Content Provider 主要的功能就是存儲並檢索數據以及向其他應用程序提供訪問數據的藉口。 

    Android 系統爲一些常見的數據類型(如音樂、視頻、圖像、手機通信錄聯繫人信息等)內置了一系列的 Content Provider, 這些都位於android.provider包下。持有特定的許可,可以在自己開發的應用程序中訪問這些Content Provider。

   讓自己的數據和其他應用程序共享有兩種方式:創建自己的Content Provier(即繼承自ContentProvider的子類)  或者是將自己的數據添加到已有的Content Provider中去,後者需要保證現有的Content Provider和自己的數據類型相同且具有該 Content Provider的寫入權限。對於Content Provider,最重要的就是數據模型(data model) 和 URI。

   創建自己的Content Provier主要分爲以下幾步:

1、創建Content Provier並應用SQLite存儲系統

package org.guocheng.act;

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;

public class MyContentProvider extends ContentProvider {

	private SQLiteDatabase     sqlDB;
    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";

    private static class DatabaseHelper extends SQLiteOpenHelper {
        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 int delete(Uri uri, String s, String[] as) {
        return 0;
    }

    @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 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 int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
        return 0;
    }
}
2、定義URI及字段

package org.guocheng.act;

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

public class MyUsers {
	public static final String AUTHORITY  = "org.guocheng.act.MyContentProvider";

     // BaseColumn類中已經包含了 _id字段
     public static final class User implements BaseColumns {
	     public static final Uri CONTENT_URI  = Uri.parse("content://org.guocheng.act.MyContentProvider");
	     // 表數據列
	     public static final String  USER_NAME  = "USER_NAME";
    }
}
3、建立activity,生成數據,查詢數據並以listview展現

package org.guocheng.act;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

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

public class ContentProviderTestActivity extends Activity {
	
	ListView lv ;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        insertRecord("MyUsers");
        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 );
		List<String> ls = new ArrayList<String>();
		
		if (cur.moveToFirst()) {
			for (int i = 0; i < cur.getCount(); i++) {
				String name = cur.getString(1);
				ls.add(name);
				cur.moveToNext();
			}
		}
		
		lv = (ListView)findViewById(R.id.lis);
		
		lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, ls));
	
    }  
}
main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">

	<ListView android:id="@+id/lis" android:layout_height="wrap_content"
		android:layout_width="wrap_content" android:paddingLeft="20px">
	</ListView>
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.guocheng.act"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ContentProviderTestActivity"
                  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="MyContentProvider" android:authorities="org.guocheng.act.MyContentProvider" />
    </application>
</manifest>

所有代碼結束。
運行效果圖:


OK,這就是自定義的Content Provider.希望對你有所幫助。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章