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

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

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);

ArrayList> coll

= new ArrayList>();

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,

https://www.360docs.net/doc/e02179732.html,yout.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 https://www.360docs.net/doc/e02179732.html,.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 = "com.misoo.provider.rx09-02";

public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY

+ "/Student");

private static final String[] PROJECTION

= new String[]{ "stud_no", "stud_name"};

@Override protected 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);

ArrayList> coll = new ArrayList>();

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,

https://www.360docs.net/doc/e02179732.html,yout.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();}

}

指令:

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 https://www.360docs.net/doc/e02179732.html,.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); }

@Override public 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()); }

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} }

// ---------------------------------------------------------------------------------

private DatabaseHelper mOpenHelper;

@Override public boolean onCreate() {

mOpenHelper = new DatabaseHelper(getContext()); return true; }

@Override public 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;

}

@Override public String getType(Uri uri) { return null; }

@Override public Uri insert(Uri uri, ContentValues initialValues) { return uri; }

@Override public int delete(Uri uri, String where, String[] whereArgs) { return 0; }

@Override public int update(Uri uri, ContentValues values, String where,

String[] whereArgs)

{ return 0; }

}

类别定义:

public class DataProvider extends ContentProvider {

// …..…..

}

DataProvider类别继承ContentProvider父类别,也继承了它的接口定义。ContentProvider接口定义了多个函数,主要包括:

l query()函数---- 它查询出合乎某条件的数据。

l insert()函数---- 它将存入一笔新资料。

l delete()函数---- 它删除合乎某条件的资料。

l update()函数---- 更新某些笔数据的内容。

在这个DataProvider类别里,撰写了query()函数内的指令,来实现query()接口,这个query()函数实际呼叫SQLite数据库的功能。也就是说,ac01等应用程序透过ContentProvider 接口间接呼叫到DataProvider的query()函数,然后此query()函数才使用SQLite的服务。

由于此范例的DataProvider已经是ContentProvider嫡系身份了,必须由Android来启动它,而不是有ac01等应用程序来直接启动它,所以必须在AndroidManifest.xml文档里给Android一些指示,如下:

/* ----- AndroidManifest.xml 文檔------*/

package="com.misoo.pkrr"

android:versionCode="1"

android:versionName="1.0.0">

android:label="@string/app_name">

android:authorities="com.misoo.provider.rx09-02">

这特别说明DataProvider是一个ContentProvider,于是Android就会来启动它。

Android项目文档

课程代号:83308113 2014-2015学年第1学期《ISAS与项目训练(一)》 项目:Android 班级:网络2班 学号: 13734214 姓名:刘雨亭. 指导教师:温一军周洪斌 . 沙洲职业工学院 NIIT安艾艾迪

目录 一、系统简介 (3) 二、发展历程 (3) 三、发行版本 (4) 四、国内外手机应用状况 (4) 五、发展趋势 (5) 六、Android的相关技术介绍及分析 (6) 6.1、Android系统架构研究 (6) 6.2、应用程序框架 (7) 6.3、类库 (8) 七、Android的API (10) 八、Android活动的生命周期 (11)

一、系统简介 Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。其中的文字使用了Ascender 公司专门制作的称之为“Droid ”的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS 376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的品牌象徵。有时候,它们还会使用纯文字的Logo。 二、发展历程 2003年10月,Andy Rubin等人创建Android公司,并组建Android团队。 2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队。安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目。 2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与84家硬件制造商、软件开发

03-04-Android开发技术讲义 之启动另一个Activity

Android开发技术讲义之启动另一个 Activity 紧接着上一个练习,我们为上一个练习app添加一些代码,使之当我们点击send 按钮的时候能够启动另一个Activity。 任务 在文本框中输入消息,点击Send按钮,消息会显示在第二个Activity中。 对发送按钮进行响应 1.在res/layout目录中,编辑activity_my.xml 2.在

相关文档
最新文档