亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android中自定義ContentProvider實例

2020-04-11 12:06:20
字體:
來源:轉載
供稿:網友
//以下為TestBaidu
MainActivity如下:
復制代碼 代碼如下:

package cn.testbaidu;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
/**
* Demo描述:
* 應用A(TestBaidu)調用另外一個應用(TestContentProvider)
* 中的自定義ContentProvider,即:
* 1 自定義ContentProvider的使用
* 2 其它應用調用該ContentProvider
*
* 測試方法:
* 1 依次測試ContentProvider的增查刪改(注意該順序)
* 2 其它應用查詢該ContentProvider的數據
*
*/
public class MainActivity extends Activity {
private Button mAddButton;
private Button mDeleteButton;
private Button mUpdateButton;
private Button mQueryButton;
private Button mTypeButton;
private ContentResolver mContentResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
mContentResolver=this.getContentResolver();

mAddButton=(Button) findViewById(R.id.addButton);
mAddButton.setOnClickListener(new ClickListenerImpl());

mDeleteButton=(Button) findViewById(R.id.deleteButton);
mDeleteButton.setOnClickListener(new ClickListenerImpl());

mUpdateButton=(Button) findViewById(R.id.updateButton);
mUpdateButton.setOnClickListener(new ClickListenerImpl());

mQueryButton=(Button) findViewById(R.id.queryButton);
mQueryButton.setOnClickListener(new ClickListenerImpl());

mTypeButton=(Button) findViewById(R.id.typeButton);
mTypeButton.setOnClickListener(new ClickListenerImpl());

}
private class ClickListenerImpl implements OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.addButton:
Person person=null;
for (int i = 0; i < 5; i++) {
person=new Person("xiaoming"+i, "9527"+i,(8888+i));
testInsert(person);
}
break;
case R.id.deleteButton:
testDelete(1);
break;
case R.id.updateButton:
testUpdate(3);
break;
case R.id.queryButton:
//查詢表
//queryFromContentProvider(-1);

//查詢personid=2的數據
testQuery(2);
break;
case R.id.typeButton:
testType();
break;
default:
break;
}

}

}
private void testInsert(Person person) {
ContentValues contentValues=new ContentValues();
contentValues.put("name", person.getName());
contentValues.put("phone", person.getPhone());
contentValues.put("salary",person.getSalary());
Uri insertUri=Uri.parse("content://cn.bs.testcontentprovider/person");
Uri returnUri=mContentResolver.insert(insertUri, contentValues);
System.out.println("新增數據:returnUri="+returnUri);
}

private void testDelete(int index){
Uri uri=Uri.parse("content://cn.bs.testcontentprovider/person/"+String.valueOf(index));
mContentResolver.delete(uri, null, null);
}

private void testUpdate(int index){
Uri uri=Uri.parse("content://cn.bs.testcontentprovider/person/"+String.valueOf(index));
ContentValues values=new ContentValues();
values.put("name", "hanmeimei");
values.put("phone", "1234");
values.put("salary", 333);
mContentResolver.update(uri, values, null, null);
}
private void testQuery(int index) {
Uri uri=null;
if (index<=0) {
//查詢表
uri=Uri.parse("content://cn.bs.testcontentprovider/person");
} else {
//按照id查詢某條數據
uri=Uri.parse("content://cn.bs.testcontentprovider/person/"+String.valueOf(index));
}

//對應上面的:查詢表
//Cursor cursor= mContentResolver.query(uri, null, null, null, null);

//對應上面的:查詢personid=2的數據
//注意:因為name是varchar字段的,所以應該寫作"name='xiaoming1'"
// 若寫成"name=xiaoming1"查詢時會報錯
Cursor cursor= mContentResolver.query(uri, null, "name='xiaoming1'", null, null);

while(cursor.moveToNext()){
int personid=cursor.getInt(cursor.getColumnIndex("personid"));
String name=cursor.getString(cursor.getColumnIndex("name"));
String phone=cursor.getString(cursor.getColumnIndex("phone"));
int salary=cursor.getInt(cursor.getColumnIndex("salary"));
System.out.println("查詢得到:personid=" + personid+",name="+name+",phone="+phone+",salary="+salary);
}
cursor.close();
}

private void testType(){
Uri dirUri=Uri.parse("content://cn.bs.testcontentprovider/person");
String dirType=mContentResolver.getType(dirUri);
System.out.println("dirType:"+dirType);

Uri itemUri=Uri.parse("content://cn.bs.testcontentprovider/person/3");
String itemType=mContentResolver.getType(itemUri);
System.out.println("itemType:"+itemType);
}
}

Person如下:
復制代碼 代碼如下:

package cn.testbaidu;
public class Person {
private Integer id;
private String name;
private String phone;
private Integer salary;
public Person(String name, String phone,Integer salary) {
this.name = name;
this.phone = phone;
this.salary=salary;
}
public Person(Integer id, String name, String phone,Integer salary) {
this.id = id;
this.name = name;
this.phone = phone;
this.salary=salary;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Integer getSalary() {
return salary;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", phone=" + phone+ ", salary=" + salary + "]";
}



}

main.xml如下:
復制代碼 代碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/addButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dip"
android:text="增加"
android:textSize="20sp" />
<Button
android:id="@+id/deleteButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dip"
android:layout_below="@id/addButton"
android:text="刪除"
android:textSize="20sp" />
<Button
android:id="@+id/updateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dip"
android:layout_below="@id/deleteButton"
android:text="修改"
android:textSize="20sp" />
<Button
android:id="@+id/queryButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dip"
android:layout_below="@id/updateButton"
android:text="查詢"
android:textSize="20sp" />
<Button
android:id="@+id/typeButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dip"
android:layout_below="@id/queryButton"
android:text="類型"
android:textSize="20sp" />
</RelativeLayout>

//以下為TestContentProvider
MainActivity如下:
復制代碼 代碼如下:

package cn.testcontentprovider;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

ContentProviderTest如下:
復制代碼 代碼如下:

package cn.testcontentprovider;
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;
/**
* 注意事項:
* 在AndroidManifest.xml中注冊ContentProvider時的屬性
* android:exported="true"表示允許其他應用訪問.
* 這樣TestBaidu這個應用才可以訪問該處的ContentProvider
*/
public class ContentProviderTest extends ContentProvider {
private DBOpenHelper dbOpenHelper;
private UriMatcher URI_MATCHER;
private static final int PERSONS = 0;
private static final int PERSON = 1;

@Override
public boolean onCreate() {
initUriMatcher();
dbOpenHelper=new DBOpenHelper(getContext());
return true;
}
//初始化UriMatcher
private void initUriMatcher(){
URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH);
//表示返回所有的person,其中PERSONS為該特定Uri的標識碼
URI_MATCHER.addURI("cn.bs.testcontentprovider","person", PERSONS);
//表示返回某一個person,其中PERSON為該特定Uri的標識碼
URI_MATCHER.addURI("cn.bs.testcontentprovider","person/#", PERSON);
}
/**
* 插入操作:
* 插入操作只有一種可能:向一張表中插入
* 返回結果為新增記錄對應的Uri
* 方法db.insert()返回結果為新增記錄對應的主鍵值
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
switch (URI_MATCHER.match(uri)) {
case PERSONS:
long rowid=db.insert("person", "name,phone,salary", values);
return ContentUris.withAppendedId(uri, rowid);
default:
throw new IllegalArgumentException("unknown uri"+uri.toString());
}
}

/**
* 更新操作:
* 更新操作有兩種可能:更新一張表或者更新某條數據
* 在更新某條數據時原理類似于查詢某條數據,見下.
*/
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
int updataNum=0;
switch (URI_MATCHER.match(uri)) {
//更新表
case PERSONS:
updataNum=db.update("person", values, selection, selectionArgs);
break;
//按照id更新某條數據
case PERSON:
long id=ContentUris.parseId(uri);
String where="personid="+id;
if(selection!=null&&!"".equals(selection.trim())){
where=selection+" and "+where;
}
updataNum=db.update("person", values, where, selectionArgs);
break;
default:
throw new IllegalArgumentException("unknown uri"+uri.toString());
}
return updataNum;
}

/**
* 刪除操作:
* 刪除操作有兩種可能:刪除一張表或者刪除某條數據
* 在刪除某條數據時原理類似于查詢某條數據,見下.
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
int deletedNum=0;
switch (URI_MATCHER.match(uri)) {
//刪除表
case PERSONS:
deletedNum=db.delete("person", selection, selectionArgs);
break;
//按照id刪除某條數據
case PERSON:
long id=ContentUris.parseId(uri);
String where="personid="+id;
if(selection!=null&&!"".equals(selection.trim())){
where=selection+" and "+where;
}
deletedNum=db.delete("person", where, selectionArgs);
break;
default:
throw new IllegalArgumentException("unknown uri"+uri.toString());
}
return deletedNum;
}
/**
* 查詢操作:
* 查詢操作有兩種可能:查詢一張表或者查詢某條數據
* 注意事項:
* 在查詢某條數據時要注意--因為此處是按照personid來查詢
* 某條數據,但是同時可能還有其他限制.例如:
* 要求personid為2且name為xiaoming1
* 所以在查詢時分為兩步:
* 第一步:
* 解析出personid放入where查詢條件
* 第二部:
* 判斷是否有其他限制(如name),若有則將其
* 組拼到where查詢條件.
* 詳細代碼見下.
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();
Cursor cursor;
switch (URI_MATCHER.match(uri)) {
//查詢表
case PERSONS:
cursor=db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
break;
//按照id查詢某條數據
case PERSON:
//第一步:
long id=ContentUris.parseId(uri);
String where="personid="+id;
//第二步:
if(selection!=null&&!"".equals(selection.trim())){
where=selection+" and "+where;
}
cursor=db.query("person", projection, where, selectionArgs, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("unknown uri"+uri.toString());
}
return cursor;
}

/**
* 返回當前Uri所代表的數據的MIME類型.
* 如果該Uri對應的數據可能包含多條記錄,那么返回
* 字符串應該以"vnd.android.cursor.dir/"開頭
* 如果該Uri對應的數據只包含一條記錄,那么返回
* 字符串應該以"vnd.android.cursor.item/"開頭
*/
@Override
public String getType(Uri uri) {
switch (URI_MATCHER.match(uri)) {
case PERSONS:
return "vnd.android.cursor.dir/persons";
case PERSON:
return "vnd.android.cursor.item/person";
default:
throw new IllegalArgumentException("unknown uri"+uri.toString());
}
}
}

DBOpenHelper如下:
復制代碼 代碼如下:

package cn.testcontentprovider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context) {
super(context, "contentprovidertest.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone varchar(12),salary Integer(12))");
}
//當數據庫版本號發生變化時調用該方法
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
//db.execSQL("ALTER TABLE person ADD phone varchar(12) NULL");
//db.execSQL("ALTER TABLE person ADD salary Integer NULL");
}
}

AndroidManifest.xml如下:
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.testcontentprovider"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="cn.testcontentprovider.MainActivity"
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="cn.testcontentprovider.ContentProviderTest"
android:authorities="cn.bs.testcontentprovider"
android:exported="true"
/>
</application>
</manifest>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2021国产精品视频| 国产欧美精品一区二区三区介绍| 久久91精品国产| 亚洲国产精品yw在线观看| 国产精品免费一区二区三区都可以| 国产v综合ⅴ日韩v欧美大片| 91精品久久久久久久久久入口| 91精品国产综合久久久久久蜜臀| 亚洲高清久久久久久| 韩国三级电影久久久久久| 91久久嫩草影院一区二区| 久久久成人av| 久久99热这里只有精品国产| 亚洲视频日韩精品| 久热精品视频在线免费观看| 麻豆成人在线看| 中文字幕在线日韩| 欧美极品xxxx| 亚洲国产一区二区三区四区| 亚洲成人av资源网| 亚洲裸体xxxx| 日韩av中文字幕在线| 国色天香2019中文字幕在线观看| 色婷婷久久一区二区| 久久久极品av| 亚洲欧美精品中文字幕在线| 成人综合国产精品| 亚洲色图校园春色| 青青精品视频播放| 一区二区三区视频在线| 精品国产欧美成人夜夜嗨| 青青a在线精品免费观看| 亚洲肉体裸体xxxx137| 亚洲视频在线免费观看| 国产成人拍精品视频午夜网站| 亚洲女人初尝黑人巨大| 欧美老肥婆性猛交视频| 在线丨暗呦小u女国产精品| 欧美精品激情在线观看| 亚洲国产日韩欧美综合久久| 国产欧美亚洲视频| 久久精品91久久香蕉加勒比| 欧美日韩国产综合视频在线观看中文| 欧美日韩性视频在线| 欧美日韩国产精品一区二区三区四区| 国产精品视频午夜| 91色视频在线导航| 97国产精品人人爽人人做| 美日韩精品免费视频| 欧美超级免费视 在线| 久久国产精品99国产精| 精品国产欧美一区二区五十路| 最近日韩中文字幕中文| 国产成人a亚洲精品| 黑人精品xxx一区| 精品中文字幕乱| 夜夜嗨av色综合久久久综合网| 成人两性免费视频| 亚洲级视频在线观看免费1级| 久久久女女女女999久久| 久久久国产一区二区| 一区二区三区四区在线观看视频| 久久精品亚洲精品| 亚洲成人激情在线| 91欧美视频网站| 亚洲精品免费av| 国产精品老女人精品视频| 日韩在线视频观看正片免费网站| 色偷偷偷亚洲综合网另类| 国产免费一区二区三区在线能观看| 91高潮在线观看| 国产精品777| 国自产精品手机在线观看视频| 欧美性xxxx极品hd欧美风情| 色与欲影视天天看综合网| 国产精品激情av在线播放| 日韩精品在线观看视频| 亚洲精品白浆高清久久久久久| 国产精品欧美亚洲777777| 国产精品丝袜久久久久久高清| 成人免费淫片aa视频免费| 不卡伊人av在线播放| 久久男人的天堂| 中日韩美女免费视频网址在线观看| 久99久在线视频| 亚洲精品一区二区三区婷婷月| 国产极品jizzhd欧美| 亚洲国产日韩欧美在线动漫| 成人免费高清完整版在线观看| 国产成人在线视频| 性色av一区二区三区| 亚洲欧美一区二区三区情侣bbw| 国产精品久久久久久久9999| 久久伊人精品一区二区三区| 亚洲免费视频网站| 亚洲一区二区免费| 伊人久久男人天堂| 亚洲最大在线视频| 欧美性做爰毛片| 中文字幕最新精品| 久久久久久久久91| 精品欧美一区二区三区| 国产精品久久av| 国产精品久久久久99| 亚洲第一福利在线观看| 懂色aⅴ精品一区二区三区蜜月| 国产免费久久av| 午夜精品一区二区三区av| 精品久久久久久久中文字幕| 亚洲日本中文字幕免费在线不卡| 国内久久久精品| 清纯唯美日韩制服另类| 日韩欧美有码在线| 欧美大尺度电影在线观看| 久久综合久中文字幕青草| 国产成人av网址| 欧美视频在线观看 亚洲欧| 色婷婷综合久久久久| 97超级碰在线看视频免费在线看| 欧美性猛交xxxx免费看久久久| 社区色欧美激情 | 国产一区二区在线免费| 亚洲偷熟乱区亚洲香蕉av| 欧美一级在线播放| 久久精品电影一区二区| 国产精品你懂得| 日本免费在线精品| 国产69精品99久久久久久宅男| 久久久亚洲福利精品午夜| 国产成人精品久久亚洲高清不卡| 青青久久aⅴ北条麻妃| 色噜噜国产精品视频一区二区| 伊人久久五月天| 亚洲欧美日韩在线一区| 午夜精品久久久久久久白皮肤| 精品国产欧美一区二区五十路| 国产精品视频导航| 欧美性xxxx极品hd欧美风情| 欧美激情国产精品| 日韩欧美国产免费播放| 青青草成人在线| 97超碰国产精品女人人人爽| 日韩精品免费一线在线观看| 亚洲最大av在线| 国产一区二区三区在线观看视频| 成人午夜激情网| 亚洲女人天堂色在线7777| 欧美激情一二三| 欧美国产激情18| 亚洲xxx大片| 亚洲一级免费视频| 亚洲国产成人精品电影| 欧美性猛交视频| 欧美激情久久久| 国产精品美乳在线观看| 4444欧美成人kkkk| 性色av一区二区三区红粉影视| 欧美日韩国产在线看| 热久久99这里有精品| 亚洲视频免费一区| 欧美电影在线播放| 欧美激情久久久| 91精品国产综合久久香蕉的用户体验| 欧美一级淫片丝袜脚交|