Android sqlite 數據庫

1、android內的數據庫的基礎知識介紹
 
       1.用了什麼數據庫java

            android中採用的數據庫是SQLite這個輕量級的嵌入式開源數據庫,它是用c語言構建的。相關簡介能夠從連接查看。
 
       2.數據庫基本知識觀花linux

            對於一些和我同樣尚未真正系統學習數據庫技術的同窗來講,把SQL92標準中的一些基本概念、基本語句快速的瞭解一下,是頗有必要的,這樣待會用Android的database相關方法去執行一些數據庫語句時就不會茫然了。
 
       ①數據庫的基本結構——表格
 
       表格是數據庫中儲存資料的基本架構。表格被分爲欄位 (column) 及列位 (row)。每一列表明一筆資料,而每一欄表明一筆資料的一部份。舉例來講,若是咱們有一個記載顧客資料的表格,那欄位就有可能包括姓、名、地址、城市、國家、生日...等等。每個表格擁有一個獨一無二的名字(Table Name)以便可以讓用戶定位到它上面。一個典型的表格結構以下:
 
   Store_Information 表格
store_name    Sales    Date
Los Angeles    $1500    Jan-05-1999
San Diego    $250    Jan-07-1999
Los Angeles    $300    Jan-08-1999
Boston    $700    Jan-08-1999 該表格的表格名字爲Store_Information,一共有三個欄位,分別爲store_name , Sales , Data ,已經錄入了四筆數據因此有四個列位。
 
       ②關於數據類型
 
       和其餘的數據庫不一樣的是,sqlite是無類型的。也就是當你建立一個表格時,無需對每個欄位要存儲的數據的類型進行聲明,當你在給表格增長數據條目時,sqlite會自動找到存入的數據的類型。
 
       SQLite容許忽略數據類型,可是,仍然建議在Create Table語句中指定數據類型,由於數據類型有利於加強程序的可讀性。SQLite支持常見的數據類型,如VARCHAR、NVARCHAR、TEXT、 INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、 NATl0NAI, VARYINGCHARACTER。這些數據類型都是SQL92標準中規定的標準數據庫數據類型,想要有更近一步瞭解,請參看下表。
 
SQL數據庫數據類型詳解
數據類型    類型    描             述
bit    整型    bit 數據類型是整型,其值只能是0、1或空值。這種數據類型用於存儲只有兩種可能值的數據,如Yes 或No、True 或Fa lse 、On 或Off
int    整型    int 數據類型能夠存儲從- 231(-2147483648)到231 (2147483 647)之間的整數。存儲到數據庫的幾乎全部數值型的數據均可以用這種數據類型。這種數據類型在數據庫裏佔用4個字節
smallint    整型    smallint 數據類型能夠存儲從- 215(-32768)到215(32767)之間的整數。這種數據類型對存儲一些常限定在特定範圍內的數值型數據很是有用。這種數據類型在數據庫裏佔用2 字節空間
tinyint    整型    tinyint 數據類型能存儲從0到255 之間的整數。它在你只打算存儲有限數目的數值時頗有用。 這種數據類型在數據庫中佔用1 個字節
numeric    精確數值型    numeric數據類型與decimal 型相同
decimal    精確數值型    decimal 數據類型能用來存儲從-1038-1到1038-1的固定精度和範圍的數值型數據。使用這種數據類型時,必須指定範圍和精度。 範圍是小數點左右所能存儲的數字的總位數。精度是小數點右邊存儲的數字的位數
money    貨幣型    money 數據類型用來表示錢和貨幣值。這種數據類型能存儲從-9220億到9220 億之間的數據,精確到貨幣單位的萬分之一
smallmoney    貨幣型    smallmoney 數據類型用來表示錢和貨幣值。這種數據類型能存儲從-214748.3648 到214748.3647 之間的數據,精確到貨幣單位的萬分之一
float    近似數值型    float 數據類型是一種近似數值類型,供浮點數使用。說浮點數是近似的,是由於在其範圍內不是全部的數都能精確表示。浮點數能夠是從-1.79E+308到1.79E+308 之間的任意數
real    近似數值型    real 數據類型像浮點數同樣,是近似數值類型。它能夠表示數值在-3.40E+38到3.40E+38之間的浮點數
datetime    日期時間型    datetime數據類型用來表示日期和時間。這種數據類型存儲從1753年1月1日到9999年12月3 1日間全部的日期和時間數據, 精確到三百分之一秒或3.33毫秒
Smalldatetime    日期時間型    smalldatetime 數據類型用來表示從1900年1月1日到2079年6月6日間的日期和時間,精確到一分鐘
cursor    特殊數據型    cursor 數據類型是一種特殊的數據類型,它包含一個對遊標的引用。這種數據類型用在存儲過程當中,並且建立表時不能用
timestamp    特殊數據型    timestamp 數據類型是一種特殊的數據類型,用來建立一個數據庫範圍內的惟一數碼。 一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。儘管它的名字中有「time」, 但timestamp列不是人們可識別的日期。在一個數據庫裏,timestamp值是惟一的
Uniqueidentifier    特殊數據型    Uniqueidentifier數據類型用來存儲一個全局惟一標識符,即GUID。GUID確實是全局惟一的。這個數幾乎沒有機會在另外一個系統中被重建。可使用NEWID 函數或轉換一個字符串爲惟一標識符來初始化具備惟一標識符的列
char    字符型    char數據類型用來存儲指定長度的定長非統一編碼型的數據。當定義一列爲此類型時,你必須指定列長。當你總能知道要存儲的數據的長度時,此數據類型頗有用。例如,當你按郵政編碼加4個字符格式來存儲數據時,你知道總要用到10個字符。此數據類型的列寬最大爲8000 個字符
varchar    字符型    varchar數據類型,同char類型同樣,用來存儲非統一編碼型字符數據。與char 型不同,此數據類型爲變長。當定義一列爲該數據類型時,你要指定該列的最大長度。 它與char數據類型最大的區別是,存儲的長度不是列長,而是數據的長度
text    字符型    text 數據類型用來存儲大量的非統一編碼型字符數據。這種數據類型最多能夠有231-1或20億個字符
nchar    統一編碼字符型    nchar 數據類型用來存儲定長統一編碼字符型數據。統一編碼用雙字節結構來存儲每一個字符,而不是用單字節(普通文本中的狀況)。它容許大量的擴展字符。此數據類型能存儲4000種字符,使用的字節空間上增長了一倍
nvarchar    統一編碼字符型    nvarchar 數據類型用做變長的統一編碼字符型數據。此數據類型能存儲4000種字符,使用的字節空間增長了一倍
ntext    統一編碼字符型    ntext 數據類型用來存儲大量的統一編碼字符型數據。這種數據類型能存儲230 -1或將近10億個字符,且使用的字節空間增長了一倍
binary    二進制數據類型    binary數據類型用來存儲可達8000 字節長的定長的二進制數據。當輸入表的內容接近相同的長度時,你應該使用這種數據類型
varbinary    二進制數據類型    varbinary 數據類型用來存儲可達8000 字節長的變長的二進制數據。當輸入表的內容大小可變時,你應該使用這種數據類型
image    二進制數據類型    image 數據類型用來存儲變長的二進制數據,最大可達231-1或大約20億字節
 
你或許已經在納悶了,爲何以前的數據類型是大寫的,而到了這個表格就變成了小寫的。其實這是sqlite的一個不得不提的特性:sqlite是大小寫不敏感的!這一特性對於不少c語言fans來講是很不習慣的。
 
        ③數據庫的基本操做語句android

       其實這個仍是SQL92標準中的一部分,只是不一樣的數據庫會有一點點的不一樣而已,下面就對在android中最經常使用的幾個操做語句給以概述,詳細介紹請參看SQL語句簡單介紹。
 
(1)CREATE TABLE
       因爲建立一個表格,基本使用語法結構是:
CREATE TABLE "表格名" ("欄位1" 保存資料類型 , "欄位3"  保存資料類型  , "欄位2" 保存資料類型 .....);
       例如我要建立剛纔的Store_Information表格,就能夠這樣:
CREATE TABLE  Store_Information (Store_Name char[50] , Sales long , Date date );  
       須要提示的是,這裏仍是聲明瞭數據類型。並且不難發現,c語言構建的sqlite自身也有一些c語言的性格(例如一個完整語句後的分號)。
 
 
(2)SELECT
用於將資料從數據庫中的表格內選出,基本語法結構爲:
SELECT "欄位名" FROM "表格名" ;
例如我想將 Store_Information 裏面的store_name 選出,則能夠這樣:
SELECT store_name FROM Store_Information ;
 
這句執行後就會顯示以下的信息:
 
 
store_name
Los Angeles
San Diego
Los Angeles
Boston
 
 
好了,效果一目瞭然。
 
(3)SELECT語句能夠添加條件來縮小選擇結果:
 
 
去掉重複的結果:
 
SELECT DISTINCT "欄位名" FROM "表格名" 
例如將剛纔的語句改成:
SELECT DISTINCT store_name FROM Store_Information ;
 
則顯示的結果爲:sql

store_name
Los Angeles
San Diego
Boston
 
實現有條件的篩選:
 
SELECT "欄位名" FROM "表格名" WHERE "條件語句" ;
 
條件語句和c語言中的相似,只不過用AND表示「且」,OR表示「或」。
 
例如對錶執行以下語句:
 
SELECT store_name FROM Store_Information WHERE Sales > 1000 ;
 
則顯示結果爲:
 
 
store_name 
 
Los Angeles
 
 
其中WHERE語句用的較多,由於它能夠實現自定義條件的使用和多條件的組合。
 
(4)INSERT INTO
 
在表格中加入資料——能夠實現一筆的加入和多筆的加入。
 
加入一筆:
INSERT INTO "表格名" ("欄位1", "欄位2", ...) VALUES ("值1", "值2", ...);shell

加入多筆:
INSERT INTO "待加入數據的表格" ("欄位1", "欄位2", ...) SELECT "欄位3", "欄位4", ... FROM "被加入的表格" ;
 
加入多筆其實就是將另外一個表格加入到現有表格中。
 
(5)UPDATE
 
用於修改表格中的數據,語法結構爲:
 
UPDATE "表格名" SET "欄位1" = [新值] WHERE {條件};
 
例如:
 
UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "Jan-08-1999" ;
 
具體是什麼意思的話就不說了,你懂的~~~
 
(6)DELETE FROM
 
刪除表格中的某些數據,語法結構爲:
 
DELETE FROM "表格名" WHERE {條件} ;
 
知足條件的全部資料都會被刪除掉。
 
 
 
2、如何在android中調用數據庫資源數據庫

在android中主要有兩種方法來實現對數據庫的訪問,一種是adb shell方式,另外一種是經過相關的android 的java類來間接的對數據庫來進行操做。其中前者主要用於在開發過程當中進行調試等工做,後者則爲android中主要的使用數據庫的方式。
下面就對這兩種方式進行一個簡要的介紹。
 
1.adb shell方式
 
說白了,adb shell 就是一個android模擬器的後臺資源調用器(我的理解啦~~)。它的操做方式和命令提示符差很少——以命令行的方式進行。
 
既然是模擬器的後臺資源調用器,那固然得先打開android模擬器了。
 
打開模擬器後,再打開命令提示符,在裏面輸入adb shell,這時會出現一個#號(懂linux的同窗懂的),具體效果以下:
 架構

而後你就能夠像在linux下進行shell命令的執行了。
 
接着輸入 cd data/data/ 並執行,再執行ls,則會顯示一些安裝的軟件的工程包名,效果以下:
 app

 
其實這在模擬器中是以一個個文件夾的形式存在的,因此你能夠用cd命令進入它。例如我進入一個後,再用ls命令顯示裏面的內容:
 
 dom

該文件夾內又存在databases、 lib等文件夾(若是沒有databases的話能夠本身手動用mkdir命令建立一個)。而這個databases文件夾就是這個應用的數據庫文件的所在地,cd進入後,應該會看到裏面有一個或多個.db格式的文件(其實sqlite對文件的名字沒有特殊要求,你用.txt等其餘的格式也能夠,但推薦.db)。若是沒有db文件的話,能夠用以下命令建立:sqlite3 mydata.db。這樣就會在databases裏面生成了一個數據庫文件。若是已存在,能夠直接用sqlite3命令調用該數據庫文件,命令爲 sqlite3 mydata.db(其實就是和剛纔的命令一個樣)。接下來你就會看到:
 ide

 
在sqlite>後面就能夠執行你的sql語句了。下面執行了一些簡單的語句:
 

 
好了,adb shell的方式介紹到這裏。
 
2.經過android中的相關java類
 
 
      Android中對數據庫進行操做的相關的藉口、類等都在andorid.database和android.database.sqlite兩個包裏面。裏面存在着不少的與數據庫操做相關的類,可是在平時普通的開發中最常常遇到的僅僅就是那幾個類而已,因此在這裏我就省去通篇的介紹,對一些經常使用的接口、類作一下簡介。
 
①SQLiteDatabase(android.database.sqlite.SQLiteDatabase)
 
文檔信息:
public class
SQLiteDatabase
 
Exposes methods to manage a SQLite database.SQLiteDatabase has methods to create, delete, execute SQLcommands, and perform other common database management tasks.atabase names must be unique within an application, not across all applications.
 
 
簡介:
這個是在android中數據庫操做使用最頻繁的一個類。經過它能夠實現數據庫的建立或打開、建立表、插入數據、刪除數據、查詢數據、修改數據等操做。
 
重要方法介紹:
 
(1)public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)
     public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)
這個方法用於打開或建立一個數據庫(對於sqlite來講,就是打開或產生一個數據庫文件),參數中的File類就是java中表示系統文件路徑的File類,而SQLiteDatabase.CursorFactory則是一個產生Cursor對象的工廠類(Cursor接口將在後面介紹到)。

(2)public long insert (String table, String nullColumnHack, ContentValues values)
看到它的名字以及sql中的相關語句你不難猜到這個方法用於在數據庫中加入數據。ContentValue相似於java中HashMap類,用於以鍵值對的方式保存數據。

(3)public int delete (String table, String whereClause, String[] whereArgs)
不用說了,用於刪除表中的數據。

(4)public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
名字很長是吧,它的功能也很強大,用於查詢數據庫中的數據。

(5)public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
用於修改數據。根據傳入參數的名字能夠對使用方法略知一二。

(6)public void execSQL (String sql, Object[] bindArgs)
     public void execSQL (String sql)
這是我我的認爲最爲重要的方法。這個方法用於執行你用String表示的非查詢(由於它不會返回一個Cursor對象)的sql語句,例如CREATE,SELECT等。遺憾的是如今尚沒法一次調用該方法來執行用「;」分開的多條sql語句。第二個重寫方法使用的更多些。
另外在此提問:第一個重寫方法中bindArgs表示的是一些什麼,用來作什麼用,知道的同窗能夠告訴我下,謝謝!

(7)public void close ()
用來關閉數據庫並釋放數據庫佔用的相關資源。

 
②SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)
 
文檔信息:
public abstract class
SQLiteOpenHelper
A helper class to manage database creation and version management. You create a subclass implementingonCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.
 
簡介:
正如它的名字所表述的同樣,這個抽象類是一個輔助類(Helper),用來打開(若數據庫已存在)或建立數據庫的。關於抽象類咱們都知道,若是要使用它,必定是繼承它。因此使用它都是經過本身定義一個類繼承於它,並實現onCreate(SQLiteDatabase) , onUpgrade(SQLiteDatabase, int, int) , onOpen(SQLiteDatabase)三個方法。
在我看來,所謂的輔助類,其實就是充當了一個封裝器——也就是說用於對其輔助的類實現一個java上的封裝。在這裏,SQLiteOpenHelper就是用來對SQLiteDatabase進行一個封裝處理。初學的同窗想要進一步理解的話能夠先看看什麼是封裝。
 
它包含的方法以下:
 
(1)synchronized void close()
      關閉任何已開啓的數據庫對象。
(2)synchronized SQLiteDatabase getReadableDatabase()
      建立或打開一個僅僅可讀的(read-only)數據庫。
(3)synchronized SQLiteDatabase getWritableDatabase()
      建立或打開一個可讀可寫的數據庫。
(4)abstract void onCreate(SQLiteDatabase db)
      當數據庫被第一次建立時被調用的的方法(相似於Activity的onCreate())。
(5)void onOpen(SQLiteDatabase db)
      數據庫已經被成打開後被調用。
(6)abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
      當數據庫須要被更改(更新)時被調用。
 
 
③Cursor(android.database.Cursor)
 
文檔信息:
public interface
Cursor
This interface provides random read-write access to the result set returned by a database query.
 
簡介:
Cursor沒有構造方法,只能經過query方法得到。
前面提到了,execSQL方法沒法執行與查詢相關的sql語句,是由於沒法返回一個Cursor對象——查詢須要將查到的結果(就是表中的哪一行知足查詢條件)返回,execSQL是返回void的,因此沒法操做查詢語句。從這裏能夠了解到,Cursor接口從某種意義上說就是爲了彌補這一點的——query方法就是返回了一個Cursor對象。從名字上看,它的意思是遊標,因此大概能夠猜到他起到了一個指代的做用(事實上就是的,它指代數據庫中保存數據的表的一行,而且還能夠簡單的處理該行數據項的信息)。從類的描述看,Cursor提供了對一個數據庫查詢動做返回結果束的隨機讀寫途徑,也就是說,它是一個對查詢操做返回結果進行進一步處理的類,而這些處理就是用Cursor裏的方法實現的。
結合SimpleCursorAdapter這個適配器類,你能夠很方便的將數據庫中的數據顯示到AdapterView(例如ListView,GridView)中——這也是Cursor的另外一大用處。
若是你瞭解java中的迭代器(Iterator)的話你就會發現其實Cursor和迭代器有些類似,這樣你可能會更快的瞭解Cursor。
 
一些經常使用的方法有:
(1)public abstract boolean moveToPosition (int position)
    public abstract boolean moveToFirst ()
    public abstract boolean moveToLast ()
    public abstract boolean moveToNext ()
    public abstract boolean moveToPrevious ()
把這些方法放在一塊兒的目的很明顯:它們都是對Cursor指向的位置進行操做的方法——移到某個指定的位置、移到第一行、移到最後一行、移向下一行、移向上一行等等。
 
(2)public abstract int getCount ()
返回Cursor指向的表含有的總數據項數。
 
(3)public abstract boolean requery ()
Cursor是被一個query方法產生的,而這個方法就是將那個query方法所作的查詢動做再執行一遍——這將會改變調用該方法的Cursor對象的值,也就是說,Cursor使用了該方法後就復位了。
 
(4)public abstract boolean isClosed ()
    public abstract boolean isFirst ()
    public abstract boolean isLast ()
    public abstract boolean isNull (int columnIndex)
    public abstract boolean isClosed ()
    public abstract boolean isAfterLast ()
    public abstract boolean isBeforeFirst ()
在java中,相似於isWhatever形式的方法大都是對對象狀態進行判斷的方法——Whatever成立則返回true,不成立則返回false。這些方法也不例外。
值得提一下的是isNull方法,該方法測試某個欄位所保存的信息是否爲NULL。參數columnIndex表明了那個欄位的代號。
 
④另外建議各位瞭解一下SimpleCursorAdapter(android.widget.SimpleCursorAdapter)這個適配器類。
 
 
 
好了,介紹這麼多了,該上源碼了。這個源碼很簡單,但表明一種使用模式,因此仍是值得仔細研究的。
 
1.實現一個繼承SQLiteOpenHelper的類
import android.content.ContentValues;  
import android.content.Context;  
import android.database.Cursor;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteOpenHelper;  
public class DBHelper extends SQLiteOpenHelper {  
    private static final String DB_NAME = "coll.db";  
    private static final String TBL_NAME = "CollTbl";  
    private static final String CREATE_TBL = " create table "  
            + " CollTbl(_id integer primary key autoincrement,name text,url text, desc text) ";  
      
    private SQLiteDatabase db;  
    DBHelper(Context c) {  
        super(c, DB_NAME, null, 2);  
    }  
    @Override  
    public void onCreate(SQLiteDatabase db) {  
        this.db = db;  
        db.execSQL(CREATE_TBL);  
    }  
    public void insert(ContentValues values) {  
        SQLiteDatabase db = getWritableDatabase();  
        db.insert(TBL_NAME, null, values);  
        db.close();  
    }  
    public Cursor query() {  
        SQLiteDatabase db = getWritableDatabase();  
        Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);  
        return c;  
    }  
    public void del(int id) {  
        if (db == null)  
            db = getWritableDatabase();  
        db.delete(TBL_NAME, "_id=?", new String[] { String.valueOf(id) });  
    }  
    public void close() {  
        if (db != null)  
            db.close();  
    }  
    @Override  
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
    }  
}  
 
2.建立一個錄入數據的類
 
import android.app.Activity;  
import android.content.ContentValues;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText;  
public class AddActivity extends Activity {  
    private EditText et1, et2, et3;  
    private Button b1;  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.add);  
        this.setTitle("添加收藏信息");  
        et1 = (EditText) findViewById(R.id.EditTextName);  
        et2 = (EditText) findViewById(R.id.EditTextUrl);  
        et3 = (EditText) findViewById(R.id.EditTextDesc);  
        b1 = (Button) findViewById(R.id.ButtonAdd);  
        b1.setOnClickListener(new OnClickListener() {  
            public void onClick(View v) {  
                String name = et1.getText().toString();  
                String url = et2.getText().toString();  
                String desc = et3.getText().toString();  
                ContentValues values = new ContentValues();  
                values.put("name", name);  
                values.put("url", url);  
                values.put("desc", desc);  
                DBHelper helper = new DBHelper(getApplicationContext());  
                helper.insert(values);  
                Intent intent = new Intent(AddActivity.this,  
                        QueryActivity.class);  
                startActivity(intent);  
            }  
        });  
    }  
}  
 
3.建立一個顯示數據庫數據的類

import android.app.AlertDialog;   import android.app.ListActivity;   import android.content.DialogInterface;   import android.database.Cursor;   import android.os.Bundle;   import android.view.View;   import android.widget.AdapterView;   import android.widget.ListView;   import android.widget.SimpleCursorAdapter;   import android.widget.AdapterView.OnItemClickListener;   public class QueryActivity extends ListActivity {       @Override       public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           this.setTitle("瀏覽收藏信息");           final DBHelper helpter = new DBHelper(this);           Cursor c = helpter.query();           String[] from = { "_id", "name", "url", "desc" };           int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };           SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,                   R.layout.row, c, from, to);           ListView listView = getListView();           listView.setAdapter(adapter);                                 final AlertDialog.Builder builder = new AlertDialog.Builder(this);           listView.setOnItemClickListener(new OnItemClickListener() {               @Override               public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,                       long arg3) {                   final long temp = arg3;                   builder.setMessage("真的要刪除該記錄嗎?").setPositiveButton("是",                           new DialogInterface.OnClickListener() {                               public void onClick(DialogInterface dialog,                                       int which) {                                   helpter.del((int)temp);                                   Cursor c = helpter.query();                                   String[] from = { "_id", "name", "url", "desc" };                                   int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };                                   SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(),                                           R.layout.row, c, from, to);                                   ListView listView = getListView();                                   listView.setAdapter(adapter);                               }                           }).setNegativeButton("否",                           new DialogInterface.OnClickListener() {                               public void onClick(DialogInterface dialog,                                       int which) {                                                                  }                           });                   AlertDialog ad = builder.create();                   ad.show();               }           });           helpter.close();       }   }

相關文章
相關標籤/搜索