2.高焕堂讲解 ContentProvider范例
1.  何谓Android的嫡系组件
  Android4项一等公民(或称为嫡系亲属),包括:ActivityContentProviderIntentReceiverService。它们都必须宣告于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.javaDataProvider.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小时内删除。