当前位置: 网学 > 编程文档 > Android > 正文

Android讲义_高焕堂2.ContentProvider范例

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: myeducs.cn 发布时间: 13/03/17

【网学网提醒】:网学会员鉴于大家对十分关注,论文会员在此为大家搜集整理了“Android讲义_高焕堂2.ContentProvider范例”一文,供大家参考学习


    2.高焕堂讲解ContentProvider范例高焕堂讲解
    1.何谓Android的嫡系组件Android有4项一等公民(或称为嫡系亲属),包括:Activity,ContentProvider,IntentReceiver与Service.它们都必须宣告于AndroidManifest.xml档案里,如下:这让Android知道我们城市里定义了多少个嫡系组件类别;Android可以在启动时就将它们执行起来,成为共享的(Shared)服务组件.这些嫡系服务组件间的沟通,通常是透过「意图」(Intent)对象来请Android转达给对方,Android则会依据意图而找出最佳的配对.配对成功,就展开相互的沟通与服务了.2.什么是ContentProvider嫡系组件----以SQLite为例
    在Android里,SQLite数据库是最典型的ContentProvider,负责储存各式各样的内容.除了数据库之外,还有许多其它种类的ContentProvider.在这里并不是要介绍这些ContentProvider,而是要透过SQLite认识ContentProvider接口,然后将舶来Linter组件,配上这种ContentProvider接口,让它摇身一变成为Android的嫡系组件.
    2.1
    一般(即非嫡系一般即非嫡系)SQLite的范例即非嫡系
    没有透过ContentProvider接口来使用SQLite,就是对SQLite的「非嫡系」用法.此时,应用程序透过JDBC接口和SQL语句来与SQLite沟通,以存取数据库里的内容.先认识这种传统用法.此范例将从SQLite读取数据.首先建立一个程序项目,其含有两个Java程序文件:ac01.java和DataProvider.java.其中,ac01.java是典型的Activity类别,负责UI画面的显示工作,而DataProvider则负责与SQLite沟通.其详细程序代码为:/*-----ac01.java程序代码------*/packagecom.misoo.pklx;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Map;importandroid.app.ListActivity;importandroid.database.Cursor;importandroid.os.Bundle;
     importandroid.view.View;importandroid.widget.ListView;importandroid.widget.SimpleAdapter;publicclassac01extendsListActivity{privatestaticfinalString[]PROJECTION=newString[]{"stud_no","stud_name"};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInst
    anceState);DataProviderdp=newDataProvider(this);Cursorcur=dp.query(PROJECTION,null,null,null);ArrayList>coll=newArrayList>();Mapitem;cur.moveToFirst();while(!cur.isAfterLast()){item=newHashMap();item.put("c1",cur.getString(0)+","+cur.getString(1));coll.add(item);cur.moveToNext();}dp.close();this.setListAdapter(newSimpleAdapter(this,coll,android.R.layout.simple_list_item_1,newString[]{"c1"},newint[]{android.R.id.text1}));}@OverrideprotectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){finish();}}指令:DataProviderdp=newDataProvider(this);这和一般类别之用法是一样的.ac01对象指名要诞生一个DataProvider的物件.然后呼叫它,如下指令:Cursorcur=dp.query(PROJECTION,null,null,null);这要求SQLite从数据库查询出某些数据.详细的DataProvider.java程序代码如下:/*-----DataProvider.java程序代码------*/packagecom.misoo.pklx;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.util.Log;publicclassDataProvider{privatestaticfinalStringDATABASE_NAME="StudDB";privatestaticfinalStringTABLE_NAME="Student";privatefinalintDB_MODE=Context.MODE_PRIVATE;privateSQLiteDatabasedb=null;publicDataProvider(Contextctx){try{db=ctx.openOrCreateDatabase(DATABASE_NAME,DB_MODE,null);catch(Exceptione){Log.e("ERROR",e.toString());return;}try{db.execSQL("droptable"+TABLE_NAME);}catch(Exceptione){Log.e("ERROR",e.toString());
    }
    }
     db.execSQL("CREATETABLE"+TABLE_NAME+"("+"stud_no"+"TEXT,"+"stud_name"+"TEXT"+");");Stringsql_1="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S101','Lily');";Stringsql_2="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S102','Linda');";Stringsql_3="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S103','Bruce');";try{db.execSQL(sql_1);db.execSQL(sql_2);db.execSQL(sql_3);}catch(SQLExceptione){Log.e("ERROR",e.toString());return;}}publicCursorquery(String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){Cursorcur=db.query(TABLE_NAME,projection,null,null,null,null,null);returncur;}publicvoidclose(){db.close();}}这种用法属于非嫡系的用法:在ac01.java程序代码里,其指令:DataProviderdp=newDataProvider(this);明确指定由DataProvider对象来提供服务.反之,嫡系用法则是透过意图(Intent)来请Android代为配对,进而找出适当的ContentProvider对象来为aco1对象提供服务.
    2.2
    嫡系SQLite的范例
    刚才的范例里,我们直接使用DataProvider类别的接口来与SQLite沟通.本节的范例,将替DataProvider配上ContentProvider接口,让ac01对象能透过ContentPr
    ovider新接口来沟通.此范例也是从SQLite数据库读取3笔数据;请仔细看看其程序代码的微妙差异:/*-----ac01.java程序代码------*/packagecom.misoo.pkrr;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Map;importandroid.app.ListActivity;importandroid.content.Intent;importandroid.database.Cursor;importandroid.net.Uri;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.ListView;importandroid.widget.SimpleAdapter;publicclassac01extendsListActivity{publicstaticintg_variable;publicstaticfinalStringAUTHORITY="com.misoo.provider.rx09-02";publicstaticfinalUriCONTENT_URI=Uri.parse("content://"+AUTHORITY+"/Student");privatestaticfinalString[]PROJECTION=newString[]{"stud_no","stud_name"};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);Intentintent=getIntent();if(intent.getData()==null)intent.setData(CONTENT_URI);
     Cursorcur=getContentResolver().query(getIntent().getData(),PROJECTION,null,null,null);ArrayList>coll=newArrayList>();Mapitem;cur.moveToFirst();while(!cur.isAfterLast()){item=newHashMap();item.put("c1",cur.getString(0)+","+cur.getString(1));coll.add(item);cur.moveToNext();}this.setListAdapter(newSimpleAdapter(this,coll,android.R.layout.simple_list_item_1,newString[]{"c1"},newint[]{android.R.id.text1}));}@OverrideprotectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){finish();}}指令:Cursorcur=getContentResolver().query(getIntent().getData(),PROJECTION,null,null,null);要求Android代为寻找适合的ContentProvider来提供服务,并不刻意指定由DataProvider对象来担任.只要合乎ConentProvider接口,且符合意图条件的对象皆可以来为ac01对象提供服务.于是,ac01程序代码就不再直接呼叫DataProvider类别的函数了,而是呼叫ContentProvider接口所提供的函数.再来仔细看看DataProvider类别与ContentProvider接口的搭配情形:/*-----DataProvider.java程序代码------*/packagecom.misoo.pkrr;importandroid.content.ContentProvider;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.net.Uri;importandroid.util.Log;publicclassDataProviderextendsContentProvider{privatestaticfinalStringDATABASE_NAME="StudNewDB";privatestaticfinalintDATABASE_VERSION=2;privatestaticfinalStringTABLE_NAME="StudTable";privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{DatabaseHelper(Contextcontext){super(context,DATABASE_NAME,null,DATABASE_VERSION);}@OverridepublicvoidonCreate(SQLiteDatabasedb){db.execSQ
    L("CREATETABLE"+TABLE_NAME+"("+"stud_no"+"TEXT,"+"stud_name"+"TEXT"+");");Stringsql_1="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S1001','Pam');";Stringsql_2="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S1002','Steve');";Stringsql_3="insertinto"+TABLE_NAME+"(stud_no,stud_name)values('S1003','John');";try{db.execSQL(sql_1);db.execSQL(sql_2);db.execSQL(sql_3);}catch(SQLExceptione){Log.e("ERROR",e.toString());}
     }@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){}}//--------------------------------------------------------------------------------privateDatabaseHelpermOpenHelper;@OverridepublicbooleanonCreate(){mOpenHelper=newDatabaseHelper(getContext());returntrue;}@OverridepublicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){SQLiteDatabasedb=mOpenHelper.getReadableDatabase();Cursorc=db.query(TABLE_NAME,projection,null,null,null,null,null);returnc;}@OverridepublicStringgetType(Uriuri){returnnull;}@OverridepublicUriinsert(Uriuri,ContentValuesinitialValues){returnuri;}@Overridepublicintdelete(Uriuri,Stringwhere,String[]whereArgs){return0;}@Overridepublicintupdate(Uriuri,ContentValuesvalues,Stringwhere,String[]whereArgs){return0;}}类别定义:publicclassDataProviderextendsContentProvider{//…..…..}DataProvider类别继承ContentProvider父类别,也继承了它的接口定义.ContentProvider接口定义了多个函数,主要包括:lquery()函数----它查询出合乎某条件的数据.linsert()函数----它将存入一笔新资料.ldelete()函数----它删除合乎某条件的资料.lupdate()函数----更新某些笔数据的内容.在这个DataProvider类别里,撰写了query()函数内的指令,来实现query()接口,这个query()函数实际呼叫SQLite数据库的功能.也就是说,ac01等应用程序透过ContentProvider接口间接呼叫到DataProvider的query()函数,然后此query()函数才使用SQLite的服务.由于此范例的DataProvider已经是ContentProvider嫡系身份了,必须由Android来启动它,而不是有ac01等应用程序来直接启动它,所以必须在AndroidManifest.xml文档里给Android一些指示,如下:/*-----AndroidManifest.xml文档------*/
     这特别说明DataProvider是一个ContentProvider,于是Android就会来启动它.
    
    
  • 下一篇资讯: Android讲义-3-16最新版
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号