android100 自定义内容提供者
生活随笔
收集整理的這篇文章主要介紹了
android100 自定义内容提供者
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#ContentProvider,就是來操作數據的,增刪改查,
* 四大組件之一
* 應用的數據庫是不允許其他應用訪問的
* 內容提供者的作用就是讓別的應用訪問到你的數據庫
* 內容提供者的作用:把私有數據暴露給其他應用,通常,是把私有數據庫的數據暴露給其他應用
*短信聯系人都是在數據庫里面。mmssms是短信數據庫,
*短信數據庫有短信數據庫的內容提供者,聯系人數據庫有聯系人數據庫的內容提供者。拿到對應數據庫的內容提供者就能夠訪問對應的數據庫數據。###短信數據庫
* sms表* body:短信內容* date:短信時間* address:對方號碼* type:發送還是接收###聯系人數據庫
* raw_contacts表* contact_id:聯系人id
* data表:存放聯系人的詳細的信息,每行數據是單獨的一條聯系人信息* data1:聯系人的具體的信息* raw_contact_id:該行信息屬于哪個聯系人* mimetype_id:該行信息屬于什么類型
* mimetypes表:mimetype_id對應的類型的字符串###UriMatcher
* 用于判斷一條uri跟指定的多條uri中的哪條匹配
* 添加匹配規則//指定多條urium.addURI("com.itheima.person", "person", PERSON_CODE);um.addURI("com.itheima.person", "company", COMPANY_CODE);//#號可以代表任意數字um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
* 通過Uri匹配器可以實現操作不同的表@Overridepublic Uri insert(Uri uri, ContentValues values) {if(um.match(uri) == PERSON_CODE){db.insert("person", null, values);}else if(um.match(uri) == COMPANY_CODE){db.insert("company", null, values);}else{throw new IllegalArgumentException();}return uri;}
* 如果路徑中帶有數字,把數字提取出來的apiint id = (int) ContentUris.parseId(uri); 01項目的MyOpenHelper:
package com.itheima.customcontentprovider;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper;public class MyOpenHelper extends SQLiteOpenHelper {public MyOpenHelper(Context context) {super(context, "people.db", null, 2);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table person(_id integer primary key autoincrement, name char(10), money integer(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("create table teacher(_id integer primary key autoincrement, name char(10))");} } 01項目Test.java
package com.itheima.customcontentprovider;import android.test.AndroidTestCase;public class Test extends AndroidTestCase {public void test(){MyOpenHelper oh = new MyOpenHelper(getContext());//getContext()是獲取虛禮上下文 oh.getWritableDatabase();} } 02項目的MainActivity.java
package com.itheima.visitprovider;import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.view.Menu; import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void insert(View v){//通過內容提供者把數據插入people數據庫//拿到contentResolver來訪問內容提供者ContentResolver cr = getContentResolver();ContentValues values = new ContentValues();values.put("name", "趙帥哥"); // values.put("money", "13000");//url:內容提供者的主機名地址//values:要插入的數據cr.insert(Uri.parse("content://com.itheima.people/teacher"), values);//com.itheima.people是01項目的內容提供者的地址,teacher表示插入teacher表 }public void delete(View v){ContentResolver cr = getContentResolver();int i = cr.delete(Uri.parse("content://com.itheima.people"), "name = ?", new String[]{"小志"});System.out.println(i);}public void update(View v){ContentResolver cr = getContentResolver();ContentValues values = new ContentValues();values.put("name", "sb志");int i = cr.update(Uri.parse("content://com.itheima.people"), values, "name = ?", new String[]{"大志"});System.out.println(i);}public void select(View v){ContentResolver cr = getContentResolver();Cursor cursor = cr.query(Uri.parse("content://com.itheima.people/person/4"), null, null, null, null);//person表示是person表,4是用來作id的,while(cursor.moveToNext()){String name = cursor.getString(1);String money = cursor.getString(2);System.out.println(name + ";" + money);}}} 01項目PersonProvider.java
package com.itheima.customcontentprovider.provider;import com.itheima.customcontentprovider.MyOpenHelper;import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;public class PersonProvider extends ContentProvider {private MyOpenHelper oh;SQLiteDatabase db;//創建uri匹配器對象static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);//檢測其他用戶傳入的uri與匹配器定義好的uri中,哪條匹配static {um.addURI("com.itheima.people", "person", 1);//content://com.itheima.people/personum.addURI("com.itheima.people", "teacher", 2);//content://com.itheima.people/teacherum.addURI("com.itheima.people", "person/#", 3);//content://com.itheima.people/person/4,#表示任何數字,*表示任何文本, }//內容提供者創建時調用 @Overridepublic boolean onCreate() {oh = new MyOpenHelper(getContext());db = oh.getWritableDatabase();return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor cursor = null;if(um.match(uri) == 1){cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);}else if(um.match(uri) == 2){cursor = db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder, null);}else if(um.match(uri) == 3){//把uri末尾攜帶的數字取出來long id = ContentUris.parseId(uri);cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder, null);}else{throw new IllegalArgumentException("uri又有問題喲親么么噠");}return cursor;}@Overridepublic String getType(Uri uri) {if(um.match(uri) == 1){return "vnd.android.cursor.dir/person";//表示請求的是person的多條數據 }else if(um.match(uri) == 3){return "vnd.android.cursor.item/person";//表示請求的是person的單條數據 }return null;}//此方法供其他應用調用,用于往people數據庫里插數據//values:由其他應用傳入,用于封裝要插入的數據//uri:內容提供者的主機名,也就是地址 @Overridepublic Uri insert(Uri uri, ContentValues values) {//使用uri匹配器匹配傳入的uriif(um.match(uri) == 1){db.insert("person", null, values);//發送數據改變的通知//uri:通知發送到哪一個uri上,所有注冊在這個uri上的內容觀察者都可以收到這個通知getContext().getContentResolver().notifyChange(uri, null);}else if(um.match(uri) == 2){db.insert("teacher", null, values);getContext().getContentResolver().notifyChange(uri, null);}else{throw new IllegalArgumentException("uri有問題喲親么么噠");}return uri;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {int i = db.delete("person", selection, selectionArgs);return i;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int i = db.update("person", values, selection, selectionArgs);return i;}} /*清單文件: <provider android:name="com.itheima.customcontentprovider.provider.PersonProvider" android:authorities="com.itheima.people" android:exported="true"> </provider> authorities="com.itheima.people"是一個地址,是內容提供者的地址,通過這個地址就可以訪問到這個內容提供者<instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.itheima.customcontentprovider"> </instrumentation> */
package com.itheima.customcontentprovider;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper;public class MyOpenHelper extends SQLiteOpenHelper {public MyOpenHelper(Context context) {super(context, "people.db", null, 2);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table person(_id integer primary key autoincrement, name char(10), money integer(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("create table teacher(_id integer primary key autoincrement, name char(10))");} } 01項目Test.java
package com.itheima.customcontentprovider;import android.test.AndroidTestCase;public class Test extends AndroidTestCase {public void test(){MyOpenHelper oh = new MyOpenHelper(getContext());//getContext()是獲取虛禮上下文 oh.getWritableDatabase();} } 02項目的MainActivity.java
package com.itheima.visitprovider;import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.view.Menu; import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void insert(View v){//通過內容提供者把數據插入people數據庫//拿到contentResolver來訪問內容提供者ContentResolver cr = getContentResolver();ContentValues values = new ContentValues();values.put("name", "趙帥哥"); // values.put("money", "13000");//url:內容提供者的主機名地址//values:要插入的數據cr.insert(Uri.parse("content://com.itheima.people/teacher"), values);//com.itheima.people是01項目的內容提供者的地址,teacher表示插入teacher表 }public void delete(View v){ContentResolver cr = getContentResolver();int i = cr.delete(Uri.parse("content://com.itheima.people"), "name = ?", new String[]{"小志"});System.out.println(i);}public void update(View v){ContentResolver cr = getContentResolver();ContentValues values = new ContentValues();values.put("name", "sb志");int i = cr.update(Uri.parse("content://com.itheima.people"), values, "name = ?", new String[]{"大志"});System.out.println(i);}public void select(View v){ContentResolver cr = getContentResolver();Cursor cursor = cr.query(Uri.parse("content://com.itheima.people/person/4"), null, null, null, null);//person表示是person表,4是用來作id的,while(cursor.moveToNext()){String name = cursor.getString(1);String money = cursor.getString(2);System.out.println(name + ";" + money);}}} 01項目PersonProvider.java
package com.itheima.customcontentprovider.provider;import com.itheima.customcontentprovider.MyOpenHelper;import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;public class PersonProvider extends ContentProvider {private MyOpenHelper oh;SQLiteDatabase db;//創建uri匹配器對象static UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);//檢測其他用戶傳入的uri與匹配器定義好的uri中,哪條匹配static {um.addURI("com.itheima.people", "person", 1);//content://com.itheima.people/personum.addURI("com.itheima.people", "teacher", 2);//content://com.itheima.people/teacherum.addURI("com.itheima.people", "person/#", 3);//content://com.itheima.people/person/4,#表示任何數字,*表示任何文本, }//內容提供者創建時調用 @Overridepublic boolean onCreate() {oh = new MyOpenHelper(getContext());db = oh.getWritableDatabase();return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {Cursor cursor = null;if(um.match(uri) == 1){cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder, null);}else if(um.match(uri) == 2){cursor = db.query("teacher", projection, selection, selectionArgs, null, null, sortOrder, null);}else if(um.match(uri) == 3){//把uri末尾攜帶的數字取出來long id = ContentUris.parseId(uri);cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder, null);}else{throw new IllegalArgumentException("uri又有問題喲親么么噠");}return cursor;}@Overridepublic String getType(Uri uri) {if(um.match(uri) == 1){return "vnd.android.cursor.dir/person";//表示請求的是person的多條數據 }else if(um.match(uri) == 3){return "vnd.android.cursor.item/person";//表示請求的是person的單條數據 }return null;}//此方法供其他應用調用,用于往people數據庫里插數據//values:由其他應用傳入,用于封裝要插入的數據//uri:內容提供者的主機名,也就是地址 @Overridepublic Uri insert(Uri uri, ContentValues values) {//使用uri匹配器匹配傳入的uriif(um.match(uri) == 1){db.insert("person", null, values);//發送數據改變的通知//uri:通知發送到哪一個uri上,所有注冊在這個uri上的內容觀察者都可以收到這個通知getContext().getContentResolver().notifyChange(uri, null);}else if(um.match(uri) == 2){db.insert("teacher", null, values);getContext().getContentResolver().notifyChange(uri, null);}else{throw new IllegalArgumentException("uri有問題喲親么么噠");}return uri;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {int i = db.delete("person", selection, selectionArgs);return i;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int i = db.update("person", values, selection, selectionArgs);return i;}} /*清單文件: <provider android:name="com.itheima.customcontentprovider.provider.PersonProvider" android:authorities="com.itheima.people" android:exported="true"> </provider> authorities="com.itheima.people"是一個地址,是內容提供者的地址,通過這個地址就可以訪問到這個內容提供者<instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.itheima.customcontentprovider"> </instrumentation> */
?02項目就訪問到了01項目的數據庫。
轉載于:https://www.cnblogs.com/yaowen/p/4970145.html
總結
以上是生活随笔為你收集整理的android100 自定义内容提供者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elang 安装
- 下一篇: [ay原创作品]用wpf写了个模仿36K