2.高焕堂讲解 ContentProvider范例
1. 何谓Android的嫡系组件
Android有4项一等公民(或称为嫡系亲属),包括:Activity、ContentProvider、IntentReceiver与Service。它们都必须宣告于l档案里,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="schemas.android/apk/res/android"
package="com.misoo.SQ03">
<uses-permission xmlns:android="schemas.android/apk/res/android"
android:name="android.permission.INTERNET">
</uses-permission>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<provider android:name="DataProvider"
android:authorities="com.misoo.provider.SQ03">
</provider>
<activity android:name=".ac01" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".DispActivity" android:label="DispActivity">
</activity>
</application>
</manifest>
这让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安卓intent用法 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);
ArrayList<Map<String, Object>> coll
= new ArrayList<Map<String, Object>>();
Map<String, Object> item;
veToFirst();
while(!cur.isAfterLast()) {
item = new HashMap<String, Object>();
item.put("c1", String(0) + ", " + String(1));
coll.add(item);
veToNext();
}
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 t.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" + ");");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论