1. 程式人生 > >Android學習筆記 四一 SQLite的使用

Android學習筆記 四一 SQLite的使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

SQLite是非常流行的嵌入式關係型資料庫,輕載,速度快,而且是開源。在Android中,runtime提供SQLite,所以我們可以使用SQLite,而且是全集的SQLite。SQLite提供SQL介面,和一般的資料庫一樣。但是Android的API不採用JDBC,JDBC消耗太多的資源。

SQLite支援絕大部分SQL-92標準,不支援:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL OUTER JOIN, and some flavors of ALTER TABLE.而我們在手持終端上使用SQLite,一般並不涉及太複雜的資料庫處理,除了上訴,其他的SQL,包括tirger、transaction等都是支援,應該說SQLite提供的功能是足夠。

和一般的SQL資料庫比較,最大的差異是資料型別,例如我們定義一個表的某個column的資料型別為INTEGET,如果在插入時這個數值採用String,在SQLite中是包會產生錯誤,我們可以將定義表格的資料型別作為一個提示,用於說明期待的資料型別,但是並不真實起到檢測作用。如果真的需要限制,要以來程式的其他部分進行判斷。

1、建立我們的資料庫

在MySQL等資料庫中,第一步是建立資料庫,第二步是建立表,如需要,還加上我們的初始預製的資料。在Android的SQLite的使用是一樣的。稍微特別一點是,我們需要通過繼承SQLiteOpenHelper這個類來達到目的。對於抽象類SQLiteOpenHelper的繼承,需要重寫:1)constructor,2)onCreate()和onUpgrade(),下面舉例介紹。

這個例子,我們建立一個稱為bebook_db的資料庫,裡面有一個叫mytable的表格,有三列:_id,Name,Weight。下面我們將演示如何建立資料庫,如何在資料庫中建立表,如何刪除表,如何更新資料庫。

/* 對於抽象類SQLiteOpenHelper的繼承,需要重寫:1)constructor,2)onCreate()和onUpgrade()  * */
public class Chapter22Db extends SQLiteOpenHelper{
    public static final String DATABASE_BAME ="bebook_db";

    /* step 1 :重寫建構函式中,繼承super的建構函式,建立database */
    public Chapter22Db(Context context){
        /* 第一個引數 為當前環境
         * 第二個引數 String name為資料庫檔案,如果資料存放在記憶體 ,則為null,
         * 第三個引數 為SQLiteDatabase.CursorFactory  factory,存放cursor,預設設定為null
         * 第四個引數 為int version資料庫的版本,從1開始,如果版本舊,則通過onUpgrade()進行更新,如果版本新則通過onDowngrade()進行釋出。例如,我要更改mytable表格,增加一列,或者修改初始化的資料,或者程式變得複雜,我需要增加一個表,這時我需要在版本的數字增加,在載入時,才會對SQLite中的資料庫個更新,這點非常重要,同時參見onUpgrade()的說明 */

        super(context,DATABASE_BAME,null,1);
    }
   
    /*step 2 :重寫onCreate(),如果Android系統中第一次建立我們的資料庫時(即後面介紹呼叫getWritableDatabase()或者getReadbleDatabase()時),將呼叫onCreate(),這這裡建立資料庫(雖然在建構函式中填入資料庫名,但資料庫的建立實在onCreate()中自動進行。在這裡一般進行建立table和寫入初始資料*/
    public void onCreate(SQLiteDatabase db) {
        //建立table:SQL的語句是“CREATE TABLE constants(_id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT, value REAL);”,我們可以直接通過db.execSQL(SQLCommand)來執行沒有返回值的SQL語言,例如CREATE,DELETE,UPDATE,INSERT,DROP。
        db.execSQL("CREATE TABLE mytable(_id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT,Weight REAL); ");
       
        //下面是加入三個原始資料,如果對錶格進行增、刪、改、查,後面會詳細介紹。下面的幾個資料來自Android自帶的重力表,據說是為了感測器管理用,Android已經考慮到我們在月球和火星上使用Android手機的情況^_^,程式設計師有時真的很無聊……
        ContentValues cv = new ContentValues();
        
        cv.put("Name", "Gravity, Earth");
        cv.put("Weight", SensorManager.GRAVITY_EARTH);
        db.insert("mytable", "Name", cv);
        
        cv.put("Name", "Gravity, Mars");
        cv.put("Weight", SensorManager.GRAVITY_MARS);
        db.insert("mytable", "Name", cv);

        cv.put("Name", "Gravity, Moon");
        cv.put("Weight", SensorManager.GRAVITY_MOON);
        db.insert("mytable", "Name", cv);
    }

    /* step 3:重寫onUpgrade(),如果版本比原來的高,將呼叫onUpgrade(),在這個例子中,我們刪除原來的表格,根據新需求建立*/
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //這次同樣通過db.execSQL(SQLCommand)來執行沒有返回值的SQL語言,將表格刪除
        db.execSQL("DROP TABLE IF EXISTS mytable");
        onCreate(db);
    }

}

2、和資料庫進行關聯

就如同在MYSQL中進行來資料庫的建立,表格建立和初始資料的填寫,其他的操作一般在Activity中和使用者互動產生。回憶一下我們在Linux環境中如何處理,首先是要建立和資料庫的連線,Android也一樣,另外在Activity結束時,我們需要將連線斷開,以釋放有關資源。

public class Chapter22Test1 extends ListActivity{
    private SQLiteDatabase  db = null;
    private Cursor cursor = null; //在後面與ListView互動中使用

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 獲取處理SQLiteOpenHelper的子類的SQLite的例項,如果只讀,可以採用getReadableDatabase(),這個例子我們獎通過SQLiteDatabase例項的操作,來進行對資料進行增刪改查詢,採用可寫的方式。
        db= (new Chapter22Db (getApplicationContext())).getWritableDatabase();  
    }

    protected void onDestroy() {
        super.onDestroy();
       //釋放和資料庫的連線
        db.close();
    }
}

3、對錶格進行操作

對錶格的操作有兩種方式,一種是RAW方式,即直接給出SQL語句,另一種是採用SQLiteDatabase中給出的方法來進行,姑且稱為API方式。下面就這兩種方式的增、刪、改、查進行實驗。

3.1增加一行資料

在設定建立表格時,使用了db.execSQL(SQLCommand)來執行沒有返回值的SQL語言,這個是RAW方式。另一種方式在之前加入原始資料時給出,通過db.insert("mytable","Name",<ContentValues values>);來實現。其中第二個引數比較特別。SQL是不執行加入一個空的行。如果第二個引數不設定為null,則對這種情空行情況進行處理,將對應列的值設定為“NULL”。

//RAW方式。
db.execSQL("INSERT INTO mytable(Name,Weight) VALUES ('Test1',1.0);");
//API方式,通過db.insert("mytable","Name",<ContentValues values>);來處理,其中ContentValues是用於儲存名稱和數值,對應為表格的列的名詞和其在行中的資料。
ContentValues values =new ContentValues(2);//ContentValues有兩個數值
values.put("Name", "Test2"); //一個列名為Name,資料為Test2
values.put("Weight", 2.0); //一個列名為Weight,資料為2.0
db.insert("mytable","Name",values);

3.2刪除一行資料

//RAW方式
db.execSQL("DELETE FROM mytable WHERE Name='Test1';");    
//API方式,方法是:delete (String table, String whereClause, String[] whereArgs)
db.delete("mytable", "Name=?", {"Test1"});

3.3更新一行資料

//RAW方式
db.execSQL("UPDATE mytable SET Weight=5.0 WHERE Name='Test1';");
//API方式,方法是:update (String table, ContentValuesvalues, StringwhereClause, String[]whereArgs)
String[] name = {"Test1"};
ContentValues values =new ContentValues(2);

values.put("Name", "Test1");
values.put("Weight", 5.0);

db.update("mytable",values,"Name=?",name);

3.4查詢和遊標Cursor

上面的三個操作都是無返回值的,而查詢SELECT則不然,將返回遊標Cursor。下面是兩種方式的查詢

//RAW方式,帶返回值,採用db.rawQuery(SQL語句)方式
Cursor result1 =db.rawQuery("SELECT _id,Name,Weight from mytable ORDER BY Name", null);

/API方式,帶返回值,採用public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
String[] columns ={"Name","Weight"};
String[] name ={"Name"};

Cursor result2 = db.query("mytable", columns, "Name=?", name, null, null, null);

遊標和Iterator介面有些相似,對於Cursor result我們可以通過下面的方式來讀取資料:

result.moveToFirst();
while(!result.isAfterLast()){
    int id = result.getInt(0);
    String name = result.getString(1);
    double weight = result.getDouble(2);
    System.out.println("\t "+id + "\t["+ name + "]\t" +weight);
    result.moveToNext();
}        
result.close();    

通過Cursor我們可以讀取資料庫的詳細資訊,結合到Android學習筆記(二十):迴歸簡單的ListView,我們可以資料用ArrayList<HashMap<>>來存放,由於real非物件,簡單地用ArrayList<HashMap<String,String>>來儲存。我們已經有能力對SQLite資料進行處理,並也有能力處理ListView,這樣可以編寫我們的Activity。

然而Cursor中其實已存有資訊,我們也可以使用CursorAdapter來處理,在下一次我們將在這個例子的基礎上,經CursorAdapter和ListView結合給出例子。

“現在郭德綱在網上鬧那麼多事情,在道德在倫理上,出現這麼多問題,我搞不懂為什麼那麼多人喜歡他?”9月28日下午,姜昆在廣州講演,兩個小時的時間內,他說學逗唱,緊緊地把觀眾的耳朵拽到自己嘴邊上。他還特別對郭德綱相聲的流行表示了強烈質疑。見http://ent.qq.com/a/20111002/000037.htm。這怎麼說呢,這是中國式的惡毒和無恥的戲子的言語。1、無法在藝術上對人進行指責,就在道德上,甚至拔高到倫理上,罵人;2、並無法在道德上,指出例證,反正直接一個帽子蓋過來,這種思維和做事方式,至今依然流毒,令人恐懼和不安。比潑婦有教養,比潑婦更小人和惡毒,用潑婦與之相比,是侮辱了潑婦。

相關連結:我的Andriod開發相關文章

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述