清單 5 中的類完全封裝了一個用于存儲股票信息的 SQLite 數(shù)據(jù)庫。因為您將要使用一個嵌入式數(shù)據(jù)庫,不僅是您的應(yīng)用程序要使用它,而且也要通過應(yīng)用程序來創(chuàng)建它。您需要提供代碼來創(chuàng)建該數(shù)據(jù)庫。Android 提供一個有用的抽象幫助類 SQLiteOpenHelper。要完成這一操作,您需要擴展這個抽象類并提供代碼通過使用 onCreate 方法創(chuàng)建您的數(shù)據(jù)庫。當您有一個幫助程序?qū)嵗龝r,就可以獲取一個 SQLiteDatabase 實例,您可以用來執(zhí)行任意 SQL 語句。
您的數(shù)據(jù)庫類有兩個較為方便的方法。第一個是 addStock,用于將新股票保存到數(shù)據(jù)庫中。注意,您使用了一個 SQLiteStatement 實例,這類似于一個 java.sql.PreparedStatement。需要注意的是,在您的類構(gòu)造器中如何對其進行編譯,使其在每次調(diào)用 addStock 時都能重復(fù)利用。在每個 addStock 調(diào)用中,SQLiteStatement 的變量(INSERT_SQL 字符串中的問號)必然要將數(shù)據(jù)傳遞給 addStock。再一次強調(diào),這類似于 PreparedStatement ,您可以從 JDBC 了解它。
另一個方法是 getStocks。顧名思義,它從數(shù)據(jù)庫中檢索所有股票。注意,您再次使用一個 SQL 字符串,正如您在 JDBC 中所用的那樣。您可以在 SQLiteDatabase 類上通過使用 rawQuery 方法來進行處理。這個類也有幾個查詢方法,讓您可以不使用 SQL 直接查詢數(shù)據(jù)庫。所有這些方法都返回一個 Cursor 對象,和 java.sql.ResultSet 非常相似。您可以將 Cursor 移動到從數(shù)據(jù)庫中返回的數(shù)據(jù)所在行,在每一行,您可以使用 getInt、getString 和其他的方法來檢索您要查詢的數(shù)據(jù)庫中各列相關(guān)的值。再一次強調(diào),這和 ResultSet 十分相似。也和 ResultSet 比較相似,當您完成操作之后,關(guān)閉 Cursor 也十分重要的。如果您沒有關(guān)閉 Cursors,那么可能會迅速地耗盡內(nèi)存并導(dǎo)致您的應(yīng)用程序崩潰。
查詢本地數(shù)據(jù)庫是一個比較慢的過程,特別是,如果您有多行數(shù)據(jù)或者您需要在多個表之間運行復(fù)雜的查詢語句。然而,數(shù)據(jù)庫查詢或插入超過 5 秒且出現(xiàn)一個 Application Not Responding 對話框,這種情況不太可能發(fā)生,但是當您的數(shù)據(jù)庫忙于讀取和寫入數(shù)據(jù)時,凍結(jié)您的 UI 是不明智的。當然,避免這種情況最好的辦法是使用 AsyncTask。清單 6 展示了這個示例。
清單 6. 在一個單獨的線程上插入數(shù)據(jù)庫
Button button = (Button) findViewById(R.id.btn); button.setOnClickListener(new OnClickListener(){ public void onClick(View v) { String symbol = symbolIn.getText().toString(); symbolIn.setText(""); double max = Double.parseDouble(maxIn.getText().toString()); maxIn.setText(""); double min = Double.parseDouble(minIn.getText().toString()); minIn.setText(""); double pricePaid = Double.parseDouble(priceIn.getText().toString()); priceIn.setText(""); int quantity = Integer.parseInt(quantIn.getText().toString()); quantIn.setText(""); Stock stock = new Stock(symbol, pricePaid, quantity); stock.setMaxPrice(max); stock.setMinPrice(min); new AsyncTask<Stock,Void,Stock>(){ @Override protected Stock doInBackground(Stock... newStocks) { // There can be only one! return db.addStock(newStocks[0]); } @Override protected void onPostExecute(Stock s){ addStockAndRefresh(s); } }.execute(stock); } });
您可以先為按鈕創(chuàng)建一個實踐監(jiān)聽器。
當用戶點擊按鈕時,您可以從各個小部件(確切地說是 EditText 小部件)讀取股票數(shù)據(jù)并填入一個新的 Stock 對象。您可以創(chuàng)建一個 AsyncTask,并通過 doInBackground 方法從 清單 5 中調(diào)用 addStock 方法。如此,addStock 將在一個背景線程上執(zhí)行,而不是在主 UI 線程上。完成之后,將新 Stock 對象從數(shù)據(jù)庫傳遞到在主 UI 線程上執(zhí)行的 addStockAndRefresh 方法。
結(jié)束語
本文顯示了,即使 Android 在 Java 環(huán)境下僅支持眾多 API 的一個子集,但是其功能卻一點都不遜色。在某些示例中,比如網(wǎng)絡(luò),它完全實現(xiàn)了熟悉的 API,也提供了一些更為便捷的方法。在其他的示例中,比如并發(fā)性,Android 添加了額外 API 以及一些必須遵循的慣例。最后,在數(shù)據(jù)庫訪問案例中,Android 提供了完全不同的方法來訪問數(shù)據(jù)庫,但使用的是熟悉的概念。這不僅僅是標準 Java 和 Android Java 技術(shù)之間主觀上的差異:它們形成了Android 開發(fā)的基礎(chǔ)構(gòu)建元件。
原文:http://java.csdn.net/a/20100910/279307.html
本文鏈接:http://m.95time.cn/tech/program/2010/7958.asp
出處:CSDN
責(zé)任編輯:bluehearts
上一頁 享受Android應(yīng)用程序的Java技術(shù)盛宴 [4] 下一頁
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|