Android--簡單開發和使用ContentProvider數據共享

今天學習的時候學到了ContentProvider數據共享這個東東,所以自己寫了個小例子:

我們要開發ContentProvider的話,需要創建一個類去繼承ContentProvider,里面會讓你重寫四個方法,這四個方法就是數據共享用到的方法

包括SQLite的插入、查詢、刪除。。

所以,如何共享我們的數據,就看你如何重寫這幾個方法。

下面是操作步驟,我是用Android studio寫的

1、先看工程結構

2、我們建立一個繼承ContentProvider的類,創建步驟(右鍵→new→othet→Provider)

3、ContentProvider共享的數據是SQLite里面的數據,為了方便我把創建SQLite的數據庫和創建表的操作也寫在了ContentProvider的onCreate()方法里面了

? 代碼

package provider;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;import toolclass.MySQLiteOpenHelper;public class MyContentProvider extends ContentProvider {private static final String AUTHORITY = "com.example.fanlei.mycontentprovider";//地址private static final String DB_FILE   = "friends.db";//數據庫名稱private static final String DB_TABLE  = "friends";   //表名private static final int URI_ROOT     = -1;private static final int DB_TABLE_FRIENDS = 1;public  static final Uri CONTENT_URI  = Uri.parse("content://" + AUTHORITY + "/" + DB_TABLE);//Uri所對應的資源private static final UriMatcher uriMatcher = new UriMatcher(URI_ROOT);//檢查傳過來的Uristatic {uriMatcher.addURI(AUTHORITY,DB_TABLE,DB_TABLE_FRIENDS);}private MySQLiteOpenHelper helper;private SQLiteDatabase db;public MyContentProvider() {}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic String getType(Uri uri) {// TODO: Implement this to handle requests for the MIME type of the data// at the given URI.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic Uri insert(Uri uri, ContentValues values) {//檢查傳過來的Uri是否是正確的,若不正確,則拋出異常if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){throw new IllegalArgumentException("Unknown URI:" + uri);}Long rawId = db.insert(DB_TABLE,null,values);Uri returnUri = ContentUris.withAppendedId(CONTENT_URI,rawId);getContext().getContentResolver().notifyChange(returnUri,null);return returnUri;}@Overridepublic boolean onCreate() {helper = new MySQLiteOpenHelper(getContext(),DB_FILE,null,1);db     = helper.getWritableDatabase();String sql = "CREATE TABLE IF NOT EXISTS " + DB_TABLE +"(" +"_id primary key," +"name text," +"sexId text," +"address text);";db.execSQL(sql);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {//檢查傳過來的Uri是否是正確的,若不正確,則拋出異常if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){throw new IllegalArgumentException("Unknown URI:" + uri);}Cursor cursor = db.query(true,DB_TABLE,projection,selection,selectionArgs,null,null,sortOrder,null);cursor.setNotificationUri(getContext().getContentResolver(),uri);return cursor;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO: Implement this to handle requests to update one or more rows.throw new UnsupportedOperationException("Not yet implemented");}
}

其實,ContentProvider里面重寫的方法也是封裝了SQLiteDataBase的方法的操作,只不過他需要一個具體的Uri去指向我們具體的資源。

ContentProvider開發完成后,我在主函數里面調用了我們寫的這個ContentProvider里面的方法,布局什么的都很簡單。

我只是插入了數據,查詢數據

下面是主函數:

package com.example.fanlei.mycontentproviderdemo;import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import provider.MyContentProvider;public class MainActivity2 extends ActionBarActivity {private ContentResolver contentResolver;private Uri uri;private EditText et_1,et_2,et_3;private Button btn_1,btn_2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_activity2);contentResolver = getContentResolver();uri = MyContentProvider.CONTENT_URI;et_1 = (EditText) findViewById(R.id.et_1);et_2 = (EditText) findViewById(R.id.et_2);et_3 = (EditText) findViewById(R.id.et_3);btn_1 = (Button) findViewById(R.id.btn_1);btn_2 = (Button) findViewById(R.id.btn_2);//加入btn_1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ContentValues cv = new ContentValues();//鍵值  就是 列名cv.put("name",et_1.getText().toString());cv.put("sexId",et_2.getText().toString());cv.put("address",et_3.getText().toString());contentResolver.insert(uri,cv);Toast.makeText(MainActivity2.this,"加入成功",Toast.LENGTH_SHORT).show();}});//查詢btn_2.setOnClickListener(new View.OnClickListener() {@TargetApi(Build.VERSION_CODES.JELLY_BEAN)@Overridepublic void onClick(View v) {Cursor cursor = contentResolver.query(uri,null,"name like ?",new String[]{"%23%"},null,null);while (cursor.moveToNext()){String name    = cursor.getString(cursor.getColumnIndex("name"));String sexId   = cursor.getString(cursor.getColumnIndex("sexId"));String address = cursor.getString(cursor.getColumnIndex("address"));Log.d("asdasd",name+"^^"+sexId+"^^"+address);}}});}
}

====================================以上是簡單的開發=======================================

下面是使用我們上面的工程創建的ContentProvider

先看工程結構:

我這里建立了一個工具類去存放上一個工程Uri。

布局什么的都很簡單,就一個TextView和Button,就不放了。

下面是主函數的代碼

package com.example.fanlei.textmycontentproviderdemo;import android.content.ContentResolver;
import android.database.ContentObserver;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import provider.PeopleInfoProvider;public class MainActivity extends ActionBarActivity {private TextView tv_show;private Button button;private ContentResolver contentResolver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);contentResolver = getContentResolver();tv_show = (TextView) findViewById(R.id.tv_show);button = (Button) findViewById(R.id.btn);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);StringBuilder sb = new StringBuilder();while (cursor.moveToNext()){String name    = cursor.getString(cursor.getColumnIndex("name"));String sexId   = cursor.getString(cursor.getColumnIndex("sexId"));String address = cursor.getString(cursor.getColumnIndex("address"));sb.append(name).append(sexId).append(address);}tv_show.setText(sb.toString());}});contentResolver.registerContentObserver(PeopleInfoProvider.CONTENT_URI,true,new MyObserver(new Handler()));}private class MyObserver extends ContentObserver{/*** Creates a content observer.* @param handler The handler to run {@link #onChange} on, or null if none.*/public MyObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);StringBuilder sb = new StringBuilder();while (cursor.moveToNext()){String name    = cursor.getString(cursor.getColumnIndex("name"));String sexId   = cursor.getString(cursor.getColumnIndex("sexId"));String address = cursor.getString(cursor.getColumnIndex("address"));sb.append(name).append(sexId).append(address);Log.d("-----update----",sb.toString());}tv_show.setText(sb.toString());}}
}

對了,這里我寫了一個內部類去繼承了ContentObserver這個類,它的作用就是當共享的數據發生改變時,就會觸發這個方法。

轉載于:https://www.cnblogs.com/819158327fan/p/4939123.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375413.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ECharts數據圖表系統? 5分鐘上手!

目錄: 前言簡介方法一:模塊化單文件引入(推薦)方法二:標簽式單文件引入【前言】 最近在搗鼓各種插件各種框架,發現這個ECharts還是比較不錯的,文檔也挺全的,還是中文的,給大家推薦一下。 這篇文…

vscode 配置 pcl頭文件庫

ctrl shift p 輸入Edit configuretion 在includePath種添加 “${PCL_ROOT}/include/pcl-1.12/”

Python正則表達式中的re.S

Python正則表達式中的re.S title: Python正則表達式中的re.S date: 2014-12-21 09:55:54 categories: [Python] tags: [正則表達式,python] --- 在Python的正則表達式中,有一個參數為re.S。它表示“.”(不包含外側雙引號,下同)的作…

MySQL數據庫安全配置

文章來源:http://www.xfocus.net MySQL數據庫安全配置1、前言MySQL 是完全網絡化的跨平臺關系型數據庫系統,同時是具有客戶機/服務器體系結構的分布式數據庫管理系統。它具有功能強、使用簡便、管理方便、運行速度快、安全可靠性強等優點,用戶…

slidingmenu屬性

轉載原文 http://www.cnblogs.com/xueqiang911226/p/3564757.html 最近用到slidingmenu,要了解這個庫,首先得了解屬性和方法,特意記錄以備以后方便查詢。 SlidingMenu 常用屬性介紹: menu.setMode(SlidingMenu.LEFT);//設置左滑菜單 slidin…

每天一個linux命令(36):diff 命令

diff 命令是 linux上非常重要的工具,用于比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中打印每一個行的改動。最新版本的diff還支持二進制文件。diff程序的輸出被稱為補丁 (patch),因為Linux系統中還有一個pa…

移動conda文件夾

mv /root/anaconda3 /home/root/需要修改的文件有 ~/.bash/home/root/anaconda3/etc/profile.d/conda.sh/home/root/anaconda3/bin/conda 第一行

replace 替換全部的正確姿勢

本文同步自我的個人博客:http://www.52cik.com/2015/11/06/replace-all.html 關于字符串替換問題,其實是個很簡單的問題,但卻也不那么簡單,至少對于很多新手而言,全局替換一直是個坑。 簡單而強大的正則 可能你覺得要替…

JAVA - 單例設計模式

JAVA - 單例設計模式 一. 簡介二. 單例模式的原則三. 單例模式的實現1.1 餓漢式1.1.1 靜態變量初始化方式1.1.2 靜態代碼塊初始化方式1.1.3 枚舉方式 1.2 懶漢式1.2.1 懶加載初始化方法 (線程不安全)1.2.2 懶加載初始化方法 (線程安全&#x…

http請求報文

關于urlURL 是大型標識符 URI(統一資源標識)的一部分。這個超集是建立在已有的命名慣例基礎上的。一個 URL 是一個簡單的 URI,使用已存在的協議或規劃(也就是 http,ftp 等)作為地址的一部分。為了進一步描繪這些,我們將會Edit By Vheavens Edit By Vheavens 引入 non-URL 的 UR…

operanbsp;內容攔截

結束我大opera的一個好用功能 內容攔截 博客的主要很清爽,也可以自定義.非常好, 但打開博文,左邊的特別的精彩圖文,瞄到就不高興.好的 開始 右鍵-內容攔截 shift 點那個精彩xx,最右上角,廣告, 然后點完成.ok了 貌似我大遨游的廣告攔截更好用 轉載于:https://www.cnblogs.com/wa…

Solr-5.3.1安裝配置

Solr-5.3.1安裝配置官方網站:http://lucene.apache.org/solr/http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://lucene.apache.org/solr/quickstart.html環境:CentOS6 x64Solr-5.3.1從Solr5.0開始,Solr不再發布為在任何…

EF for Firebird

今天用了Firebird,記錄下怎么用,不然下次給忘記了 1.官網下載包 1.DDEXProvider-3.0.1.0.msi 2.FirebirdSql.Data.FirebirdClient-4.6.2.0.msi 備注: 1.發現DDEXProvider 與 FirebirdSql.Data.FirebirdClient安裝有先后順序 1.如果中間出現了…

php幾個函數

1. dirname (PHP 3, PHP 4, PHP 5) dirname -- 返回路徑中的目錄部分說明 string dirname ( string path )給出一個包含有指向一個文件的全路徑的字符串,本函數返回去掉文件名后的目錄名。 在 Windows 中,斜線(/)和反斜線&#xf…

Struts2 自定義攔截器(easy example)

要自定義攔截器需要實現com.opensymphony.xwork2.interceptor.Interceptor接口: 新建一個MyInterceptpackage com.action;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor;public class MyInterceptor i…

img標簽在div里上下居中

方法一&#xff1a;圖片尺寸未知&#xff0c;IE8-不支持 CSS部分&#xff1a; <style> .content{width:500px;height:500px;border:1px solid black;position:relative; } </style>DOM部分&#xff1a; <div class"content"> <img src"htt…

(接口)銀聯證書上傳被修改的問題和讀取證書的絕對路徑問題

最近在做對接銀聯的支付接口。相對于支付寶、微信支付&#xff0c;銀聯支付接口應該是做的最完美的了。銀聯支付平臺提供了足夠詳細的接口文檔&#xff0c;接口demo&#xff0c;常見問題解決方案。 更人性化的是&#xff0c;個人可以免費注冊一個商家賬號&#xff0c;提供給你免…

控制器對視圖聲明周期的控制

init&#xff0d;初始化程序 viewDidLoad&#xff0d;加載視圖 viewWillAppear&#xff0d;UIViewController對象的視圖即將加入窗口時調用&#xff1b; viewDidApper&#xff0d;UIViewController對象的視圖已經加入到窗口時調用&#xff1b; viewWillDisappear&#xff0d;UI…

MST:Bad Cowtractors(POJ 2377)

壞的牛圈建筑 題目大意&#xff1a;就是現在農夫又要牛修建牛欄了&#xff0c;但是農夫想不給錢&#xff0c;于是牛就想設計一個最大的花費的牛圈給他&#xff0c;牛圈的修理費用主要是用在連接牛圈上 這一題很簡單了&#xff0c;就是找最大生成樹&#xff0c;把Kruskal算法改一…