快速上手Android數據庫操作

webphp 12年前發布 | 2K 次閱讀 SME Server 網絡開發 OOoPy

Android采用關系型數據庫SQLite3,它是一個支持SQL輕量級的嵌入式數據庫,在嵌入式操作系統上有很廣泛的應用,WM采用的也是SQLite3

        關于過于、原理方面的東西在這篇文章里不會提到,但是如果你想能夠快速的學會操作SQLite3,那這就是你要找的文章!



        首先,我們看一下api,所有數據庫相關的接口、類都在android.database和android.database.sqlite兩個包下,雖然只有兩個包,但是如果你英文不好或是太懶的話也要迷茫一段時間,其實,我們真正用的到的沒有幾個!

        1、SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)

        這是一個抽象類,關于抽象類我們都知道,如果要使用它,一定是繼承它!

        這個類的方法很少,有一個構造方法



        SQLiteOpenHelper(android.content.Context context,                 java.lang.String name,android.database.sqlite.SQLiteDatabase.CursorFactory factory, int version);
        參數不做過多的解釋,CursorFactory一般直接傳null就可以

        public void onCreate(SQLiteDatabase db)
        此方法在創建數據庫是被調用,所以,應該把創建表的操作放到這個方法里面,一會兒在后面我們會再詳細的說如何創建表
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)


        從方法名上我們就能知道這個方法是執行更新的,沒錯,當version改變是系統會調用這個方法,所以在這個方法里應該執行刪除現有表,然后手動調用onCreate的操作



        SQLiteDatabase getReadableDatabase()  

        獲取可讀的SQLiteDatabase對象

        SQLiteDatabase getWritableDatabase()  
        獲取可寫的SQLiteDatabase對象

        2、SQLiteDatabase(android.database.sqlite.SQLiteDatabase)

        關于操作數據庫的工作(增、刪、查、改)都在這個類里
        execSQL(sql)
        執行SQL語句,用這個方法+SQL語句可以非常方便的執行增、刪、查、改

        除此之外,Android還提供了功過方法實現增、刪、查、改
        long insert(TABLE_NAME, null, contentValues)添加記錄
        int delete(TABLE_NAME, where, whereValue)刪除記錄
        int update(TABLE_NAME, contentValues, where, whereValue) 更新記錄
        Cursor query(TABLE_NAME, null, null, null, null, null, null) 查詢記錄

        除此之外,還有很多方法,如:beginTransaction()開始事務、endTransaction()結束事務...有興趣的可以自己看api,這里就不多贅述了
        
        3、Cursor(android.database.Cursor)

        游標(接口),這個很熟悉了吧,Cursor里的方法非常多,常用的有:
        boolean moveToPosition(position)將指針移動到某記錄
        getColumnIndex(Contacts.People.NAME)按列名獲取id
        int  getCount()獲取記錄總數
        boolean requery()重新查詢
        boolean  isAfterLast()指針是否在末尾
        boolean  isBeforeFirst()時候是開始位置
        boolean  isFirst()是否是第一條記錄
        boolean  isLast()是否是最后一條記錄
        boolean  moveToFirst()、        boolean  moveToLast()、        boolean  moveToNext()同moveToPosition(position)

        
        4、SimpleCursorAdapter(android.widget.SimpleCursorAdapter)
        
        也許你會奇怪了,之前我還說過關于數據庫的操作都在database和database.sqlite包下,為什么把一個Adapter放到這里,如果你用過Android的SQLite3,你一定會知道
,這是因為我們對數據庫的操作會經常跟列表聯系起來

        經常有朋友會在這出錯,但其實也很簡單
        SimpleCursorAdapter adapter =    new SimpleCursorAdapter(
                this,
                R.layout.list, 
                myCursor,
                new String[] {DB.TEXT1,DB. TEXT2},
                new int[]{ R.id.listTextView1,R.id.listTextView2 });
           myListView.setAdapter(adapter);
        一共5個參數,具體如下:
        參數1:Content
        參數2:布局
        參數3:Cursor游標對象
        參數4:顯示的字段,傳入String[]
        參數5:顯示字段使用的組件,傳入int[],該數組中是TextView組件的id
        到這里,關于數據庫的操作就結束了,但是到目前為止我只做了翻譯的工作,有些同學可能還是沒有掌握,放心,下面我們一起順著正常開發的思路理清一下頭緒!
        前面的只是幫沒做過的朋友做下普及,下面才是你真正需要的!
        一、寫一個類繼承SQLiteOpenHelpe
                public class DatabaseHelper extends SQLiteOpenHelper
                構造方法:
                DatabaseHelper(Context context) {
                        super(context, DATABASE_NAME, null, DATABASE_VERSION);
                }
                在onCreate方法里寫建表的操作

                        public void onCreate(SQLiteDatabase db) {

                            String sql = "CREATE TABLE tb_test (_id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,class_jb TEXT  NOT NULL,class_ysbj TEXT  NOT NULL,title TEXT  NOT NULL,content_ysbj TEXT  NOT NULL)";

                            db.execSQL(sql);//需要異常捕獲
                    }
            在onUpgrade方法里刪除現有表,然后手動調用onCtreate創建表
                    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                            String sql = "drop table "+tbname;
                            db.execSQL(sql);
                            onCreate(db);
                    }</pre><br />

                
                定義對表增、刪、查、改的方法,這里用的是SQLiteOpenHelper提供的方法,也可以用sql語句實現,都是一樣的
                關于獲取可讀/可寫SQLiteDatabase,我不說大家也應該會想到,只有查找才會用到可讀的SQLiteDatabase
 

                      /**

                     * 添加數據
                     */
                    public long insert(String tname, int tage, String ttel){
                            SQLiteDatabase db= getWritableDatabase();//獲取可寫SQLiteDatabase對象
                            //ContentValues類似map,存入的是鍵值對
                                   ContentValues contentValues = new ContentValues();
                                   contentValues.put("tname", tname);
                            contentValues.put("tage", tage);
                                   contentValues.put("ttel", ttel);
                            return db.insert(tbname, null, contentValues);
                            }
                    /**
                     * 刪除記錄
                     * @param _id
                     */
                    public void delete(String _id){
                            SQLiteDatabase db= getWritableDatabase();
                            db.delete(tbname, 
                                    "_id=?", 
                                    new String[]{_id});
                    }
                    /**
                     * 更新記錄的,跟插入的很像
                     */
                    public void update(String _id,String tname, int tage, String ttel){
                            SQLiteDatabase db= getWritableDatabase();
                                    ContentValues contentValues = new ContentValues();
                                    contentValues.put("tname", tname);
                                    contentValues.put("tage", tage);
                                   contentValues.put("ttel", ttel);
                                 db.update(tbname, contentValues, 
                                    "_id=?", 
                                    new String[]{_id});
                    }
                    /**
                     * 查詢所有數據 
                     * @return Cursor
                     */
                    public Cursor select(){
                            SQLiteDatabase db = getReadableDatabase();
                                    return db.query(
                                            tbname, 
                                            new String[]{"_id","tname","tage","ttel","taddr"}, 
                                            null, 
                                            null, null, null, "_id desc");
                    }</pre><br />

                        關于db.query方法的參數,有很多,為了防止大家弄亂,我簡單說一下
                        參數1:表名
                        參數2:返回數據包含的列信息,String數組里放的都是列名
                        參數3:相當于sql里的where,sql里where后寫的內容放到這就行了,例如:tage>?
                        參數4:如果你在參數3里寫了?(知道我為什么寫tage>?了吧),那個這里就是代替?的值 接上例:new String[]{"30"}
                        參數5:分組,不解釋了,不想分組就傳null
                        參數6:having,想不起來的看看SQL
                        參數7:orderBy排序

                到這里,你已經完成了代碼最多的第一步!我們來看看都用到了那些類:
                        SQLiteOpenHelper我們繼承使用的
                        SQLiteDatabase增刪查改都離不開它,即使你直接用sql語句,也要用到execSQL(sql)

                二、這里無非是對DatabaseHelper類定義方法的調用,沒什么可說的,不過我還是對查詢再嘮叨幾句吧
                        Android查詢出來的結果一Cursor形式返回
                                 cursor = sqLiteHelper.select();//是不是很簡單?
                        查詢出來的cursor一般會顯示在listView中,這就要用到剛才提到的SimpleCursorAdapter

                                SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                                                this,
                                                R.layout.list_row,
                                                cursor,
                                                new String[]{"tname","ttel"},
                                                new int[]{R.id.TextView01,R.id.TextView02}
                                        );

                是不是很簡單呢,任何復雜的工程都是通過簡單的代碼實現的.

</span> </div> </span>原文地址:http://android.tgbus.com/Android/tutorial/201103/346179.shtml

 本文由用戶 webphp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!