Android心得4.4--SQLite數據庫--insert()、delete等方法


1.  除了前面給大家介紹的execSQL()和rawQuery()方法, SQLiteDatabase還專門提供了對應於添加、刪除、更新、查詢的操作方法: insert()、delete()、update()和query() 。這些方法實際上是給那些不太了解SQL語法的菜鳥使用的,對於熟悉SQL語法的程序員而言,直接使用execSQL()和rawQuery()方法執行SQL語句就能完成數據的添加、刪除、更新、查詢操作。

Insert()方法用於添加數據,各個字段的數據使用ContentValues進行存放。 ContentValues類似於MAP,相對於MAP,它提供了存取數據對應的put(String key, Xxx value)和getAsXxx(String key)方法,  key為字段名稱,value為字段值,Xxx指的是各種常用的數據類型,如:String、Integer等。

SQLiteDatabase db = databaseHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put("name", "傳智播客");

values.put("age", 4);

long rowid = db.insert(“person”, null, values);//返回新添記錄的行號,與主鍵id無關

不管第三個參數是否包含數據,執行Insert()方法必然會添加一條記錄,如果第三個參數為空,會添加一條除主鍵之外其他字段值為Null的記錄。Insert()方法內部實際上通過構造insert語句完成數據的添加,Insert()方法的第二個參數用於指定空值字段的名稱,相信大家對此參數會感到疑惑,此參數的作用是干嘛的?是這樣的:如果第三個參數values 為Null或者元素個數為0, Insert()方法必然要添加一條除了主鍵之外其它字段為Null值的記錄,為了滿足這條insert語句的語法, insert語句必須給定一個字段名,如:insert into person(name) values(NULL),倘若不給定字段名 , insert語句就成了這樣: insert into person() values(),顯然這不滿足標准SQL的語法。對於字段名,建議使用主鍵之外的字段,如果使用了INTEGER類型的主鍵字段,執行類似insert into person(personid) values(NULL)的insert語句后,該主鍵字段值也不會為NULL。如果第三個參數values 不為Null並且元素的個數大於0 ,可以把第二個參數設置為null。

2. delete()、update()等方法的使用。

 delete()方法的使用:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

db.delete("person", "personid<?", new String[]{"2"});

db.close();

上面代碼用於從person表中刪除personid小於2的記錄。

update()方法的使用

SQLiteDatabase db = databaseHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(“name”, “傳智播客”);//key為字段名,value為值

db.update("person", values, "personid=?", new String[]{"1"});

db.close();

上面代碼用於把person表中personid等於1的記錄的name字段的值改為“傳智播客”。

3. query()方法實際上是把select語句拆分成了若干個組成部分,然后作為方法的輸入參數:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%傳智%"}, null, null, "personid desc", "1,2");

while (cursor.moveToNext()) {

         int personid = cursor.getInt(0); //獲取第一列的值,第一列的索引從0開始

        String name = cursor.getString(1);//獲取第二列的值

        int age = cursor.getInt(2);//獲取第三列的值

}

cursor.close();

db.close();

上面代碼用於從person表中查找name字段含有“傳智”的記錄,匹配的記錄按personid降序排序,對排序后的結果略過第一條記錄,只獲取2條記錄。

query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各參數的含義:

table:表名。相當於select語句from關鍵字后面的部分。如果是多表聯合查詢,可以用逗號將兩個表名分開。

columns:要查詢出來的列名。相當於select語句select關鍵字后面的部分。

selection:查詢條件子句,相當於select語句where關鍵字后面的部分,在條件子句允許使用占位符“?”

selectionArgs:對應於selection語句中占位符的值,值在數組中的位置與占位符在語句中的位置必須一致,否則就會有異常。

groupBy:相當於select語句group by關鍵字后面的部分

having:相當於select語句having關鍵字后面的部分

orderBy:相當於select語句order by關鍵字后面的部分,如:personid desc, age asc;

limit:指定偏移量和獲取的記錄數,相當於select語句limit關鍵字后面的部分。

4.public class DatabaseHelper extends SQLiteOpenHelper {

         private static final String name = "itcast"; //數據庫名稱

         private static final int version = 1; //數據庫版本

         ......略

}

public class HelloActivity extends Activity {

    @Override public void onCreate(Bundle savedInstanceState) {

        ......

        Button button =(Button) this.findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

     public void onClick(View v) {

         DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);

         SQLiteDatabase db = databaseHelper.getWritableDatabase();

         db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});    

         db.close(); 

     }});       

    }

}

第一次調用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper會緩存當前的SQLiteDatabase實例,SQLiteDatabase實例正常情況下會維持數據庫的打開狀態,所以在你不再需要SQLiteDatabase實例時,請及時調用close()方法釋放資源。一旦SQLiteDatabase實例被緩存,多次調用getWritableDatabase()或getReadableDatabase()方法得到的都是同一實例。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com