Android Custom ContentProvider Demo

來源:互聯網
上載者:User

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

 轉載請註明: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.希望對你有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.