Android的數據存儲:
1.SharePreference。
2.內置的SQLite數據庫。
3.ContentProvider實現數據共享。
4.Networks。
5.File IO。
SharePreference:
保存應用程序的各種配置信息,存儲的數據一般只能供本應用程序調用,不對外共享。
1.調用getSharePreferences()方法創建對象;
2.調用edit()方法獲得Editor對象,供讀寫數據:getXxx(),putXxx(),remove(),commit()。
例:
SharePreference共享數據的讀取
/** * 按下btn_write時,存放SHARED_MSGi,i=1,2,3,4,5到SETTING_PREF內容文件 */ btn_write.setOnClickListener(new Button.OnClickListener() { public void onClick(View v){ int int2 = Integer.parseInt(mEditText02.getText().toString()); long long3 = Long.parseLong(mEditText03.getText().toString()); float float4 = Float.parseFloat(mEditText04.getText().toString()); boolean boolean5 = true; if (mRadioButton01.isChecked()){ boolean5 = true; } else if (mRadioButton02.isChecked()) { boolean5 = false; } SharedPreferences settings = getSharedPreferences(SETTING_PREF, MODE_PRIVATE); settings.edit() .putString(SHARED_MSG1, mEditText01.getText().toString()) .putInt(SHARED_MSG2, int2) .putLong(SHARED_MSG3, long3) .putFloat(SHARED_MSG4, float4) .putBoolean(SHARED_MSG5, boolean5) .commit(); } }); /** * 按下btn_read時,讀取SETTING_PREF內容文件的SHARED_MSGi,i=1,2,3,4,5 */ btn_read.setOnClickListener(new Button.OnClickListener() { public void onClick(View v){ SharedPreferences settings = getSharedPreferences(SETTING_PREF, 0); String msg1 = settings.getString(SHARED_MSG1, ""); mEditText01.setText(msg1); int defint2 = 0; int msg2_int = settings.getInt(SHARED_MSG2, defint2); String msg2 = String.valueOf(msg2_int); mEditText02.setText(msg2); long deflong3 = 0; long msg3_long = settings.getLong(SHARED_MSG3, deflong3); String msg3 = String.valueOf(msg3_long); mEditText03.setText(msg3); float deffloat4 = 0; float msg4_float = settings.getFloat(SHARED_MSG4, deffloat4); String msg4 = String.valueOf(msg4_float); mEditText04.setText(msg4); boolean defboolean5 = true; boolean msg5_boolean = settings.getBoolean(SHARED_MSG5, defboolean5); if (msg5_boolean) { mRadioButton01.setChecked(true); mRadioButton02.setChecked(false); mRadioButton03.setChecked(false); } else { mRadioButton01.setChecked(false); mRadioButton02.setChecked(true); mRadioButton03.setChecked(false); } }
在程序退出時存儲數據到SharePreference上,待下次啟動時再自動讀取設置好的初始值
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mEditText01 = (EditText)findViewById(R.id.EditText01); mEditText02 = (EditText)findViewById(R.id.EditText02); /** * 開機時,自SETTING_FILE內容文件取得NAME_MSG、MOBILE_MSG,並顯示在EditText01和EditText02 */ SharedPreferences settings = getSharedPreferences(SETTING_FILE, 0); String name_msg = settings.getString(NAME_MSG, "null"); String mobile_msg = settings.getString(MOBILE_MSG, "null"); mEditText01.setText(name_msg); mEditText02.setText(mobile_msg); } @Override protected void onStop(){ super.onStop(); Toast.makeText(this, "onStop(): SharedPreferences存儲NAME_MSG、MOBILE_MSG到SETTING_FILE", Toast.LENGTH_SHORT).show(); /** * 離開時,在onStop()程序中存放NAME_MSG、MOBILE_MSG到SETTING_FILE內容文件 */ SharedPreferences settings = getSharedPreferences(SETTING_FILE, 0); settings.edit() .putString(NAME_MSG, mEditText01.getText().toString()) .putString(MOBILE_MSG, mEditText02.getText().toString()) .commit(); }
Android內置的SQLite數據庫:
1.Android提供了SQLiteDatabase代表一個數據庫,應用程序可通過創建SQLiteDatabase對象來操作數據庫.
其包含的靜態方法:
static SQLiteDatabase.openDatabase();
.openOrCreateDatabase():打開創建
execSQL():執行SQL語句.
beginTransaction(); endTransaction(); inTransaction(); 事務處理
insert(),update(),delete(),rawQuery(),Cursor,query()
2.Android SDK的tools目錄下還提供了sqlite3.exe工具,數據庫命令行管理工具.
3.數據庫幫助類SQLiteOpenHelper操作數據庫步驟:
[SQLiteOpenHelper幫助類用來初始化數據庫實例,而真正的instance數據庫實例由SQLiteDatabase創建,當第一次執行時則調用onCreate()方法]
[SQLiteOpenHelper包裝省略了SQLiteDatabase連接數據庫的過程,助手類]
(1)創建一個類,繼承SQLiteOpenHelper抽象類,重寫構造函數傳入Context上下文,復寫抽象方法:
onCreate():當第一次創建數據庫時回調該方法.
onUpgrade()當數據庫版本更新時回調該方法
(2)調用SQLiteOpenHelper的getReadableDatabase()或getWriteableDatabase()方法,
這兩個方法可封裝於自定義的openDatabase()方法中,調用則會創建數據庫或打開數據庫連接。
這兩個方法打開數據庫連接后會獲得一個用於操作數據庫的SQLiteDatabase對象,就可以開始對數據庫的增刪查改操作。
[getReadableDatabase()或getWriteableDatabase()方法調用后當數據庫不存在時會自動觸發onCreate()方法創建數據庫]
(3)調用SQLiteDatabase的方法執行SQL語句操作數據庫。
(4)處理SQL語句執行后返回的結果。
(4)調用.close()關閉數據庫連接。
例:
本范例說明數據庫的建立,數據添加,更新,刪除,檢索
/** * 本范例說明數據庫的建立,數據添加,更新,刪除,檢索 * @author Administrator * */ public class SQLiteTest extends Activity { OnClickListener listener_add = null;//監聽器類 OnClickListener listener_update = null; OnClickListener listener_delete = null; OnClickListener listener_clear = null; Button button_add; Button button_update; Button button_delete; Button button_clear; DBConnection dbhelper; //DBConnection為自定義內部類,extends SQLiteOpenHelper public int id_this; public interface UserSchema { //定義接口包裝數據庫表名和字段名 String TABLE_NAME = "Users"; //Table Name String ID = "_id"; //ID String USER_NAME = "user_name"; //User Name String ADDRESS = "address"; //Address String TELEPHONE = "telephone"; //Phone Number String MAIL_ADDRESS = "mail_address"; //Mail Address } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final EditText mEditText01 = (EditText)findViewById(R.id.EditText01); final EditText mEditText02 = (EditText)findViewById(R.id.EditText02); final EditText mEditText03 = (EditText)findViewById(R.id.EditText03); final EditText mEditText04 = (EditText)findViewById(R.id.EditText04); dbhelper = new DBConnection(this); final SQLiteDatabase db = dbhelper.getWritableDatabase(); final String[] FROM = { UserSchema.ID, UserSchema.USER_NAME, UserSchema.TELEPHONE, UserSchema.ADDRESS, UserSchema.MAIL_ADDRESS }; Cursor c = db.query(UserSchema.TABLE_NAME, new String[] {UserSchema.USER_NAME} , null, null, null, null, null); //查詢Users表,讀取所有的user_name,保存在游標Cursor中 /*query(SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit) * 第一個參數為要查詢的數據庫實例。 * 第二個參數是一個字符串數組,里邊的每一項代表了需要返回的列名。屬性名 * 第三個參數相當於SQL語句中的where部分。 * 第四個參數是一個字符串數組,里邊的每一項依次替代在第三個參數中出現的問號(?)。 * 第五個參數相當於SQL語句當中的groupby部分。 * 第六個參數相當於SQL語句當中的having部分。 * 第七個參數描述是怎么進行排序。 * 第八個參數相當於SQL當中的limit部分,控制返回的數據的個數。*/ c.moveToFirst(); CharSequence[] list = new CharSequence[c.getCount()]; /*CharSequence是char的包裝接口,不能使用new來進行賦值, * 可以定義:CharSequence cs="hello"; * 不能定義:CharSequence cs=new CharSequence("hello"); * 但此處定義的是對象數組,還沒有實例化,元素為null*/ for (int i = 0; i < list.length; i++) { list[i] = c.getString(0); c.moveToNext(); } c.close(); //關閉Cursor /** * list */ Spinner spinner = (Spinner)findViewById(R.id.Spinner01); //取得所有數據的USER_NAME,放置在list[]上 spinner.setAdapter(new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, list)); spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ //在Spinner下拉列表上選定查詢的數據,顯示所有數據在畫面上 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String user_name = ((Spinner)parent).getSelectedItem().toString(); Cursor c = db.query("Users", FROM , //查詢User表,讀取符合變量user_name的所有數據(FROM) "user_name='" + user_name + "'", null, null, null, null); c.moveToFirst(); id_this = Integer.parseInt(c.getString(0)); //將查詢到的個人數據的ID賦值給id_this,以便以后更新或檢索時用 String user_name_this = c.getString(1); //讀取所有個人數據 String telephone_this = c.getString(2); String address_this = c.getString(3); String mail_address_this = c.getString(4); c.close(); //關閉Cursor mEditText01.setText(user_name_this); mEditText02.setText(telephone_this); mEditText03.setText(address_this); mEditText04.setText(mail_address_this); } public void onNothingSelected(AdapterView<?> parent) { } }); /** * 按下[Add]按鈕時,新增一行數據 */ listener_add = new OnClickListener() { public void onClick(View v) { ContentValues values = new ContentValues();//創建ContentValues類的對象,存儲鍵值對,進行數據庫操作 values.put(UserSchema.USER_NAME, mEditText01.getText().toString()); values.put(UserSchema.TELEPHONE, mEditText02.getText().toString()); values.put(UserSchema.ADDRESS, mEditText03.getText().toString()); values.put(UserSchema.MAIL_ADDRESS, mEditText04.getText().toString()); SQLiteDatabase db = dbhelper.getWritableDatabase(); //創建數據庫連接 db.insert(UserSchema.TABLE_NAME, null, values); //插入數據到數據庫 db.close(); //關閉數據庫 onCreate(savedInstanceState); //重新執行本程序,即實現建立新的下拉列表和數據 } }; /** * 按下[Update]按鈕時,更新一行數據 */ listener_update = new OnClickListener() { public void onClick(View v) { ContentValues values = new ContentValues(); values.put(UserSchema.USER_NAME, mEditText01.getText().toString()); values.put(UserSchema.TELEPHONE, mEditText02.getText().toString()); values.put(UserSchema.ADDRESS, mEditText03.getText().toString()); values.put(UserSchema.MAIL_ADDRESS, mEditText04.getText().toString()); String where = UserSchema.ID + " = " + id_this; SQLiteDatabase db = dbhelper.getWritableDatabase(); db.update(UserSchema.TABLE_NAME, values, where ,null);//以where子句查詢到該行數據並以values的值更新 db.close(); onCreate(savedInstanceState); } }; /** * 按下[Delete]按鈕時,刪除一行數據 */ listener_delete = new OnClickListener() { public void onClick(View v) { String where = UserSchema.ID + " = " + id_this; SQLiteDatabase db = dbhelper.getWritableDatabase(); db.delete(UserSchema.TABLE_NAME, where ,null);//以where子句查詢到該行數據並刪除 db.close(); onCreate(savedInstanceState); } }; /** * 按下[Clear]按鈕時,清空編輯框 */ listener_clear = new OnClickListener() { public void onClick(View v) { mEditText01.setText(""); mEditText02.setText(""); mEditText03.setText(""); mEditText04.setText(""); } }; //設定BUTTON0i,i=1,2,3,4的OnClickListener button_add = (Button)findViewById(R.id.Button01); button_add.setOnClickListener(listener_add); button_update = (Button)findViewById(R.id.Button02); button_update.setOnClickListener(listener_update); button_delete = (Button)findViewById(R.id.Button03); button_delete.setOnClickListener(listener_delete); button_clear = (Button)findViewById(R.id.Button04); button_clear.setOnClickListener(listener_clear); } /** * 助手類,用以創建數據庫連接 * @author Administrator * */ public static class DBConnection extends SQLiteOpenHelper { private static final String DATABASE_NAME = "PhoneBookDB"; private static final int DATABASE_VERSION = 1; private DBConnection(Context ctx) { super(ctx, DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { //創建TABLE表Users String sql = "CREATE TABLE " + UserSchema.TABLE_NAME + " (" + UserSchema.ID + " INTEGER primary key autoincrement, " + UserSchema.USER_NAME + " text not null, " + UserSchema.TELEPHONE + " text not null, " + UserSchema.ADDRESS + " text not null, " + UserSchema.MAIL_ADDRESS + " text not null "+ ");"; //Log.i("haiyang:createDB=", sql); db.execSQL(sql); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } } }
本范例介紹當有大量輸入數據時,如何建立一個SQLite數據庫
/** * 本范例介紹當有大量輸入數據時,如何建立一個SQLite數據庫並將所有數據保存入庫 * 如何檢索關聯數據庫 * 添加數據庫的事務處理 * @author Administrator * */ public class SQLite extends Activity { private DatabaseHelper helper; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); helper = new DatabaseHelper(this); //DatabaseHelper自定義助手類建立數據庫和相應的表:StudentDB;students,courses; final SQLiteDatabase db = helper.getReadableDatabase(); //創建數據庫連接,返回SQLiteDatabase對象 /*----------在Student表中檢索所有的student_no,將查詢結果保存在list中,綁定在Spinner上顯示----------*/ Cursor c = db.query("students", new String[] {"student_no"} , null, null, null, null, null); //檢索查詢student_no,返回Cursor c.moveToFirst(); CharSequence[] list = new CharSequence[c.getCount()]; //CharSequence[]數組 for (int i = 0; i < list.length; i++) { list[i] = c.getString(0); //將student_no數據保存在list[]中 c.moveToNext(); } c.close(); //關閉Cursor Spinner spinner = (Spinner)findViewById(R.id.Spinner01); spinner.setAdapter(new ArrayAdapter<CharSequence>(this , android.R.layout.simple_spinner_item, list)); //將list綁定在Spinner上顯示 spinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String student_no = ((Spinner)parent).getSelectedItem().toString();//獲取被選擇的student_no /*--------在Student表中由student_no查詢student_name,並將查詢結果顯示在textView上----------*/ Cursor c; c = db.query("students", new String[] {"student_name"} , "student_no='" + student_no + "'", null, null, null, null); c.moveToFirst(); String student_this = c.getString(0); c.close(); TextView textView = (TextView)findViewById(R.id.TextView01); textView.setText(student_this); /*---在Course表中由student_no查詢student_name,並將查詢結果保存在list[]中,綁定在ListView上顯示---*/ c = db.query("courses", new String[] {"course_name"} , "student_no='" + student_no + "'", null, null, null, null); c.moveToFirst(); CharSequence[] list = new CharSequence[c.getCount()]; for (int i = 0; i < list.length; i++) { list[i] = c.getString(0); c.moveToNext(); } c.close(); ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(SQLite.this , android.R.layout.simple_list_item_1, list); ListView listView = (ListView)findViewById(R.id.ListView01); listView.setAdapter(adapter); } public void onNothingSelected(AdapterView<?> parent) { } }); } @Override protected void onDestroy() { super.onDestroy(); helper.close(); //Activity銷毀前關閉數據庫連接 } /*-------------------自定義助手類繼承SQLiteOpenHelper用於建立數據庫和相應的表-------------------------*/ class DatabaseHelper extends SQLiteOpenHelper { //SQLiteOpenHelper-建立數據庫StudentDB和Table:students,Table:courses private static final String DATABASE_NAME = "StudentDB"; private static final int DATABASE_VERSION = 1; //Table:students的數據 private String[][] STUDENTS = { {"A-123","Macoto Lin"}, {"B-456","Hatusko Ueno"}, {"C-789","Wilson Lin"}, }; //Table:courses的數據 private String[][] COURSES = { {"A-123","Japanese"}, {"A-123","Computer"}, {"A-123","English"}, {"B-456","English"}, {"B-456","Computer"}, {"C-789","Computer"}, }; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); //此處創建數據庫"StudentDB" } @Override public void onCreate(SQLiteDatabase db) { db.beginTransaction(); //此處加入事務處理Transaction try { SQLiteStatement stmt; //SQLiteStatement /*Statement是Java執行數據庫操作的一個重要方法,用於在已經建立數據庫連接的基礎上,向數據庫發送要執行的SQL語句。 */ String sql01 = "create table students (student_no text primary key, student_name text not null);"; db.execSQL(sql01); //執行SQL語句,創建Student表 stmt = db.compileStatement("insert into students values (?, ?);"); /*用compileStatement方法封裝SQL語句,可以重復編譯SQL語句, * 用?作為參數可以將后續數據連結進來,連結方式: * bindString連結字符串,bindLong連接數據 * 此處用for循環,一行一行連接數據,再一行一行執行SQL語句*/ for (String[] studentname : STUDENTS) { stmt.bindString(1, studentname[0]); stmt.bindString(2, studentname[1]); stmt.executeInsert(); } String sql02 = "create table courses (student_no text not null, course_name text not null);"; db.execSQL(sql02); //創建courses表 stmt = db.compileStatement("insert into courses values (?, ?);"); for (String[] coursename : COURSES) { stmt.bindString(1, coursename[0]); stmt.bindString(2, coursename[1]); stmt.executeInsert(); } db.setTransactionSuccessful(); //調用該方法,當處理數據不完整時可將數據回滾 } finally { db.endTransaction(); //關閉事務 } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } }
ContentProvider實現數據共享:
1.ContentProvider是不用應用程序之間進行數據交換的標准API,
ContentProvider提供存取數據的統一接口,使用它可實現在不同應用程序之間共享數據.
應用程序ContentResolver就猶如"網站",以URL的形式對外"暴露"數據.,允許其它應用程序訪問和修改數據. [~~數據庫操作]
Android為常見的一些數據提供了ContentProvider. [---主要是運用這些內置的]
2.URL:統一資源標識符
Android提供的ContentProvider都存放在android.provider包中.
ContentProvider提供的方法:insert(),delete(),update(),query(),getType().onCreate().
3.實現ContentProvider步驟:
(1)定義一個CONTENT_URI常量
(2)定義一個類,繼承ContentProvider類
(3)在AndroidManifest.xml文件中注冊<provider>
(4)實現所需的方法.
4.ContentProvider數據在Android中是以表的形式存在的-----數據庫.
Cursor:游標---query查詢,迭代輸出查詢結果.
uri.parse():將字符串轉換成uri----uriMatcher:匹配uri的工具類.
5.操作ContentProvider所暴露的數據:
(1)由getContentProvider()方法來獲取ContentResolver對象.
(2)調用ContentResolver方法操作數據:insert,delete,update,query
6.監聽ContentProvider數據改變:(Android提供的ContentObserver基類)
(1)創建一個類,繼承ContentObserver類
(2)重寫該基類所定義的onChange()方法
(3)向指定Uri注冊ContentObserver監聽器:registerContentObserver(....);
例:
ContentProvider配置文件
<provider android:name="TestProvider" android:authorities="com.example.android.provider.testprovider" />
內容提供器Content Providers的構建
/** * 內容提供器Content Providers的構建:建立一個Sqlite數據庫系統來存儲和管理數據,用SQLiteDatabase管理數據庫 * 1。創建一個類,繼承ContentProviders基類 * 2。在AndroidManifest.xml中注冊這個ContentProviders */ public class TestProvider extends ContentProvider { DatabaseHelper databaseHelper; //自定義內部類DatabaseHelper創建數據庫和表 /*----復寫extends ContentProvider的方法,采用ContentProviders方式操作數據庫---------*/ @Override public boolean onCreate() { databaseHelper = new DatabaseHelper(getContext()); return true; } @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); //打開數據庫連接 db.insert("test", null, values); //操作數據庫 return null; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables("test"); Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, null); return c; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public String getType(Uri uri) { return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } /*------------------DatabaseHelper extends SQLiteOpenHelper建立test.db和Table:test--------------------*/ private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, "test.db", null, 1); //調用構造方法創建數據庫test.db } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE test (" + BaseColumns._ID + " INTEGER PRIMARY KEY," + "name TEXT," + "description TEXT" + ");"); //執行SQL語句創建表test } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS test"); onCreate(db); } } }
采用ContentProviders方式處理數據
/** * Application A——————ContentProviders————Application B's Database * 內容提供器ContentProviders公開數據的方法 * 本范例直接在程序內生產測試用的數據,然后檢索存儲在ContentProviders數據庫內的所有行,並用列表字段顯示出檢索結果 */ public class ProviderTest extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String struri = "content://com.example.android.provider.testprovider"; //程序就是通過這個URI找到內容提供器ContentProvider Uri uri = Uri.parse(struri); //將struri字符串轉換成uri getIntent().setData(uri); //設置當前活動程序Activity接口數據的Uri Uri uri_test = getIntent().getData(); //取得當前活動程序Activity接口數據的Uri,並定義成Uri類變量uri_test ContentValues values = new ContentValues(); values.put("name", "Macoto"); values.put("description", "0932-158983"); getContentResolver().insert(uri_test, values); //采用ContentProviders方式添加數據1 values.put("name", "Ming"); values.put("description", "0932-123456"); getContentResolver().insert(uri_test, values); //采用ContentProviders方式添加數據2 Cursor cur = managedQuery(uri_test, null, null, null, null); //采用ContentProviders方式檢索存儲在數據庫內的所有行.有兩種方法,ContentResolver.query()和Activity.managedQuery() cur.moveToFirst(); ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); Map<String, Object> item; for (int i = 0; i < cur.getCount(); i++) { item = new HashMap<String, Object>(); item.put("column00", cur.getString(0)); item.put("column01", cur.getString(1)); item.put("column02", cur.getString(2)); data.add(item); //將自數據庫讀出的數據整理到ArrayList data容器內 cur.moveToNext(); } cur.close(); ListView mListView01 = new ListView(this); SimpleAdapter adapter = new SimpleAdapter(this //設置adapter封裝data數據 , data , R.layout.main , new String[] {"column00", "column01", "column02" } , new int[] {R.id.TextView01, R.id.TextView02, R.id.TextView03 }); /*將data數據的String[] {"column00", "column01", "column02" }放到顯示窗體的3個TextView上*/ mListView01.setAdapter(adapter); //綁定data數據到ListView setContentView(mListView01); //將ListView放到顯示窗體上顯示 } }
Networks:
WebView
