




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 程序代码 -*/package com.misoo.pklx;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.ListActivity;import android.database.Cursor;import android.os.Bundle;import android.view.View;import android.widget.ListView;import android.widget.SimpleAdapter;public class ac01 extends ListActivity private static final String PROJECTION = new String stud_no, stud_name ; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); DataProvider dp = new DataProvider(this); Cursor cur = dp.query(PROJECTION, null, null, null); ArrayListMap coll = new ArrayListMap(); Map item; cur.moveToFirst(); while(!cur.isAfterLast() item = new HashMap(); item.put(c1, cur.getString(0) + , + cur.getString(1); coll.add(item); cur.moveToNext(); dp.close(); this.setListAdapter(new SimpleAdapter(this, coll, android.R.layout.simple_list_item_1, new String c1 , new int android.R.id.text1); Override protected void onListItemClick(ListView l, View v, int position, long id) finish(); 指令: DataProvider dp = new DataProvider(this); 这和一般类别之用法是一样的。ac01对象指名要诞生一个DataProvider的物件。然后呼叫它,如下指令: Cursor cur = dp.query(PROJECTION, null, null, null);这要求SQLite从数据库查询出某些数据。详细的DataProvider.java程序代码如下:/* - DataProvider.java 程序代码 -*/package com.misoo.pklx;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.util.Log;public class DataProvider private static final String DATABASE_NAME = StudDB; private static final String TABLE_NAME = Student; private final int DB_MODE = Context.MODE_PRIVATE; private SQLiteDatabase db=null; public DataProvider(Context ctx) try db = ctx.openOrCreateDatabase(DATABASE_NAME, DB_MODE, null); catch (Exception e) Log.e(ERROR, e.toString(); return; try db.execSQL(drop table + TABLE_NAME); catch (Exception e) Log.e(ERROR, e.toString(); db.execSQL(CREATE TABLE + TABLE_NAME + ( + stud_no + TEXT, + stud_name + TEXT + );); String sql_1 = insert into + TABLE_NAME + (stud_no, stud_name) values(S101, Lily); String sql_2 = insert into + TABLE_NAME + (stud_no, stud_name) values(S102, Linda); String sql_3 = insert into + TABLE_NAME + (stud_no, stud_name) values(S103, Bruce); try db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); catch (SQLException e) Log.e(ERROR, e.toString(); return; public Cursor query(String projection, String selection, String selectionArgs, String sortOrder) Cursor cur = db.query(TABLE_NAME, projection, null, null, null, null, null); return cur; public void close() db.close(); 这种用法属于非嫡系的用法:在ac01.java程序代码里,其指令: DataProvider dp = new DataProvider(this);明确指定由DataProvider对象来提供服务。反之,嫡系用法则是透过意图(Intent)来请Android代为配对,进而找出适当的ContentProvider对象来为aco1对象提供服务。2.2 嫡系SQLite的范例 刚才的范例里,我们直接使用DataProvider类别的接口来与SQLite沟通。本节的范例,将替DataProvider配上ContentProvider接口,让ac01对象能透过ContentProvider新接口来沟通。此范例也是从SQLite数据库读取3笔数据;请仔细看看其程序代码的微妙差异:/* - ac01.java 程序代码 -*/package com.misoo.pkrr;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.ListActivity;import android.content.Intent;import android.database.Cursor;import .Uri;import android.os.Bundle;import android.view.View;import android.widget.ListView;import android.widget.SimpleAdapter;public class ac01 extends ListActivity public static int g_variable;public static final String AUTHORITY = vider.rx09-02;public static final Uri CONTENT_URI = Uri.parse(content:/ + AUTHORITY+ /Student);private static final String PROJECTION = new String stud_no, stud_name;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);Intent intent = getIntent();if (intent.getData() = null) intent.setData(CONTENT_URI);Cursor cur = getContentResolver().query(getIntent().getData(),PROJECTION, null, null, null);ArrayListMap coll = new ArrayListMap();Map item;cur.moveToFirst();while (!cur.isAfterLast() item = new HashMap();item.put(c1, cur.getString(0) + , + cur.getString(1);coll.add(item);cur.moveToNext();this.setListAdapter(new SimpleAdapter(this, coll,android.R.layout.simple_list_item_1, new String c1 ,new int android.R.id.text1 );Overrideprotected void onListItemClick(ListView l, View v, int position, long id) finish(); 指令: Cursor cur = getContentResolver().query(getIntent().getData(), PROJECTION, null, null, null);要求Android代为寻找适合的ContentProvider来提供服务,并不刻意指定由DataProvider对象来担任。只要合乎ConentProvider接口,且符合意图条件的对象皆可以来为ac01对象提供服务。于是,ac01程序代码就不再直接呼叫DataProvider类别的函数了,而是呼叫ContentProvider接口所提供的函数。再来仔细看看DataProvider类别与ContentProvider接口的搭配情形:/* - DataProvider.java 程序代码 -*/package com.misoo.pkrr;import android.content.ContentProvider;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 .Uri;import android.util.Log;public class DataProvider extends ContentProvider private static final String DATABASE_NAME = StudNewDB;private static final int DATABASE_VERSION = 2;private static final String TABLE_NAME = StudTable;private static class DatabaseHelper extends SQLiteOpenHelper DatabaseHelper(Context context) super(context, DATABASE_NAME, null, DATABASE_VERSION); Overridepublic void onCreate(SQLiteDatabase db) db.execSQL(CREATE TABLE + TABLE_NAME + ( + stud_no+ TEXT, + stud_name + TEXT + ););String sql_1 = insert into + TABLE_NAME+ (stud_no, stud_name) values(S1001, Pam);String sql_2 = insert into + TABLE_NAME+ (stud_no, stud_name) values(S1002, Steve);String sql_3 = insert into + TABLE_NAME+ (stud_no, stud_name) values(S1003, John);try db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); catch (SQLException e) Log.e(ERROR, e.toString();Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) / -private DatabaseHelper mOpenHelper;Overridepublic boolean onCreate() mOpenHelper = new DatabaseHelper(getContext(); return true; Overridepublic Cursor query(Uri uri, String projection, String selection,String selectionArgs, String sortOrder) SQLiteDatabase db = mOpenHelper.getReadableDatabase();Cursor c = db.query(TABLE_NAME, projection, null, null, null, null,null);return c;Overridepublic String getType(Uri uri) return null; Overridepublic Uri insert(Uri uri, ContentValues initialValu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 毒气防护知识培训记录课件
- 故宫教学课件幼儿园
- 2025年土地交易中介服务合同范本
- 官方高空吊篮使用合同范本
- 2025煤炭输送系统防磨损喷涂维修合同
- 活动管理行纪合同
- 物流速运行业知识培训总结课件
- 决策管理试题及答案
- 2025年消费信贷按揭还款合同范文
- 《昼夜和四季变化对生物的影响》课件
- 深圳流动摊贩管理办法
- 小学五年级家长会-主题班会
- 肱骨远端粉碎性骨课件
- 园林植物栽培与养护PPT完整全套教学课件
- 12K101-1 轴流通风机安装
- 邮政储汇业务员高级技师理论知识试卷5套(完整版)
- 新药发现与开发第一章概论
- 山西省煤矿建设施工管理标准
- YY/T 1792-2021荧光免疫层析分析仪
- 认识电影走进电影课件
- 服务器虚拟化资源调研表
评论
0/150
提交评论