Android學(xué)習(xí):四大組件、六大布局、五大存儲(chǔ)

一.四大組件:

Android四大組件分別為activityservice、content provider、broadcast receiver

1、activity

(1)一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕(窗口)。
(2)Activity之間通過(guò)Intent進(jìn)行通信。
(3)android應(yīng)用中每一個(gè)Activity都必須要在AndroidManifest.xml配置文件中聲明,否則系統(tǒng)將不識(shí)別也不執(zhí)行該Activity。

2、service

(1)service用于在后臺(tái)完成用戶指定的操作。service分為兩種:

  • started(啟動(dòng)):當(dāng)應(yīng)用程序組件(如activity)調(diào)用startService()方法啟動(dòng)服務(wù)時(shí),服務(wù)處于started狀態(tài)。
  • bound(綁定):當(dāng)應(yīng)用程序組件調(diào)用bindService()方法綁定到服務(wù)時(shí),服務(wù)處于bound狀態(tài)。

(2)startService()bindService()區(qū)別:

  • started service(啟動(dòng)服務(wù))是由其他組件調(diào)用startService()方法啟動(dòng)的,這導(dǎo)致服務(wù)的onStartCommand()方法被調(diào)用。當(dāng)服務(wù)是started狀態(tài)時(shí),其生命周期與啟動(dòng)它的組件無(wú)關(guān),并且可以在后臺(tái)無(wú)限期運(yùn)行,即使啟動(dòng)服務(wù)的組件已經(jīng)被銷毀。因此,服務(wù)需要在完成任務(wù)后調(diào)用stopSelf()方法停止,或者由其他組件調(diào)用stopService()方法停止。

  • 使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在了一起,調(diào)用者一旦退出,服務(wù)也就終止,大有“不求同時(shí)生,必須同時(shí)死”的特點(diǎn)。

(3)開(kāi)發(fā)人員需要在應(yīng)用程序配置文件中聲明全部的service,使用<service></service>標(biāo)簽。

(4)Service通常位于后臺(tái)運(yùn)行,它一般不需要與用戶交互,因此Service組件沒(méi)有圖形用戶界面。Service組件需要繼承Service基類。Service組件通常用于為其他組件提供后臺(tái)服務(wù)或監(jiān)控其他組件的運(yùn)行狀態(tài)。

3、content provider

(1)android平臺(tái)提供了Content Provider使一個(gè)應(yīng)用程序的指定數(shù)據(jù)集提供給其他應(yīng)用程序。其他應(yīng)用可以通過(guò)ContentResolver類從該內(nèi)容提供者中獲取或存入數(shù)據(jù)。

(2)只有需要在多個(gè)應(yīng)用程序間共享數(shù)據(jù)是才需要內(nèi)容提供者。例如,通訊錄數(shù)據(jù)被多個(gè)應(yīng)用程序使用,且必須存儲(chǔ)在一個(gè)內(nèi)容提供者中。它的好處是統(tǒng)一數(shù)據(jù)訪問(wèn)方式。

(3)ContentProvider實(shí)現(xiàn)數(shù)據(jù)共享。ContentProvider用于保存和獲取數(shù)據(jù),并使其對(duì)所有應(yīng)用程序可見(jiàn)。這是不同應(yīng)用程序間共享數(shù)據(jù)的唯一方式,因?yàn)?code>android沒(méi)有提供所有應(yīng)用共同訪問(wèn)的公共存儲(chǔ)區(qū)。

(4)開(kāi)發(fā)人員不會(huì)直接使用ContentProvider類的對(duì)象,大多數(shù)是通過(guò)ContentResolver對(duì)象實(shí)現(xiàn)對(duì)ContentProvider的操作。

(5)ContentProvider使用URI來(lái)唯一標(biāo)識(shí)其數(shù)據(jù)集,這里的URI以content://作為前綴,表示該數(shù)據(jù)由ContentProvider來(lái)管理。

4、broadcast receiver

(1)你的應(yīng)用可以使用它對(duì)外部事件進(jìn)行過(guò)濾,只對(duì)感興趣的外部事件(如當(dāng)電話呼入時(shí),或者數(shù)據(jù)網(wǎng)絡(luò)可用時(shí))進(jìn)行接收并做出響應(yīng)。廣播接收器沒(méi)有用戶界面。然而,它們可以啟動(dòng)一個(gè)activityserice來(lái)響應(yīng)它們收到的信息,或者用NotificationManager來(lái)通知用戶。通知可以用很多種方式來(lái)吸引用戶的注意力,例如閃動(dòng)背燈、震動(dòng)、播放聲音等。一般來(lái)說(shuō)是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開(kāi)它并獲取消息。

(2)廣播接收者的注冊(cè)有兩種方法,分別是程序動(dòng)態(tài)注冊(cè)和AndroidManifest文件中進(jìn)行靜態(tài)注冊(cè)。

(3)動(dòng)態(tài)注冊(cè)廣播接收器特點(diǎn)是當(dāng)用來(lái)注冊(cè)的Activity關(guān)掉后,廣播也就失效了。靜態(tài)注冊(cè)無(wú)需擔(dān)憂廣播接收器是否被關(guān)閉,只要設(shè)備是開(kāi)啟狀態(tài),廣播接收器也是打開(kāi)著的。也就是說(shuō)哪怕app本身未啟動(dòng),該app訂閱的廣播在觸發(fā)時(shí)也會(huì)對(duì)它起作用。

二.六大布局:

六大界面布局方式包括:
LinearLayout(線性布局)、
RelativeLayout(相對(duì)布局)、
TableLayout(表格布局)、
FrameLayout(幀布局)、
GridLayout(網(wǎng)格布局) 、
AbsoluteLayout(絕對(duì)布局)

1. LinearLayout 線性布局

LinearLayout容器中的組件一個(gè)挨一個(gè)排列,通過(guò)控制android:orientation屬性,可控制各組件是橫向排列還是縱向排列。
LinearLayout的常用XML屬性及相關(guān)方法:

XML屬性 相關(guān)方法 說(shuō)明
android:gravity setGravity(int) 設(shè)置布局管理器內(nèi)組件的對(duì)齊方式
android:orientation setOrientation(int) 設(shè)置布局管理器內(nèi)組件的排列方式,可以設(shè)置為horizontal、vertical兩個(gè)值之一

其中,gravity屬性支持top, left, right, center_vertical, fill_vertical, center_horizontal, fill_horizontal, center, fill, clip_vertical, clip_horizontal。也可以同時(shí)指定多種對(duì)齊方式的組合。

LinearLayout子元素支持的常用XML屬性及方法:

XML屬性 說(shuō)明
android:layout_gravity 指定該子元素在LinearLayout中的對(duì)齊方式
android:layout_weight 指定子元素在LinearLayout中所占的權(quán)重
2. TableLayout表格布局

TableLayout繼承自Linearout,本質(zhì)上仍然是線性布局管理器。表格布局采用行、列的形式來(lái)管理UI組件,并不需要明確地聲明包含多少行、多少列,而是通過(guò)添加TableRow、其他組件來(lái)控制表格的行數(shù)和列數(shù)。
每向TableLayout中添加一個(gè)TableRow就代表一行;
每向TableRow中添加一個(gè)一個(gè)子組件就表示一列;
如果直接向TableLayout添加組件,那么該組件將直接占用一行;

在表格布局中,可以為單元格設(shè)置如下三種行為方式:

  • Shrinkable:該列的所有單元格的寬度可以被收縮,以保證該表格能適應(yīng)父容器的寬度;
  • Strentchable:該列所有單元格的寬度可以被拉伸,以保證組件能完全填滿表格空余空間;
  • Collapsed:如果該列被設(shè)置為Collapsed,那么該列的所有單元格會(huì)被隱藏;

TableLayout的常用XML屬性及方法

XML屬性 相關(guān)方法 說(shuō)明
android:collapseColumns setColumns(int, boolean) 設(shè)置需要被隱藏的列的序號(hào),多個(gè)序號(hào)間用逗號(hào)分隔
android:shrinkColumns setShrinkAllColumns(boolean) 設(shè)置需要被收縮的列的序號(hào)
android:stretchColumns setStretchAllColumns(boolean) 設(shè)置允許被拉伸的列的序號(hào)
3. FrameLayout幀布局

FrameLayout直接繼承自ViewGroup組件。幀布局為每個(gè)加入其中的組件創(chuàng)建一個(gè)空白的區(qū)域(稱為一幀),每個(gè)子組件占據(jù)一幀,這些幀會(huì)根據(jù)gravity屬性執(zhí)行自動(dòng)對(duì)齊。

FrameLayout的常用XM了屬性及方法

XML屬性 相關(guān)方法 說(shuō)明
android:foreground setForeground(Drawable) 設(shè)置該幀布局容器的前景圖像
android:foregroundGravity setForeGroundGraity(int) 定義繪制前景圖像的gravity屬性
4. RelativeLayout相對(duì)布局

RelativeLayout的XML屬性及相關(guān)方法說(shuō)明

XML屬性 相關(guān)方法 說(shuō)明
android:gravity setGravity(int) 設(shè)置布局管理器內(nèi)組件的對(duì)齊方式
android:ignoreGravity setIgnoreGravity(int) 設(shè)置哪個(gè)組件不受gravity屬性的影響

為了控制該布局容器的各子組件的布局分布,RelativeLayout提供了一個(gè)內(nèi)部類:RelativeLayout.LayoutParams
RelativeLayout.LayoutParams里只能設(shè)為boolean的XML屬性:

XML屬性 說(shuō)明
android:layout_centerHorizontal 設(shè)置該子組件是否位于布局容器的水平居中
android:layout_centerVertical 設(shè)置該子組件是否位于布局容器的豎直居中
android:layout_centerParent 設(shè)置該子組件居中
android:layout_alignParentBottom 設(shè)置該子組件距底部多少
android:layout_alignParentLeft 設(shè)置該子組件距左邊多少
android:layout_alignParentRight 設(shè)置該子組件距右邊多少
android:layout_alignParentTop 設(shè)置該子組件距頂部多少

RelativeLayout.LayoutParams里屬性值為其他UI組件ID的XML屬性

XML屬性 說(shuō)明
android:layout_toRightOf 控制該子組件位于給出ID組件的右側(cè)
android:layout_toLeftOf 控制該子組件位于給出ID組件的左側(cè)
android:layout_above -
android:layout_below -
android:layout_alignTop -
android:layout_alignBottom -
android:layout_alignRight -
android:layout_alignRight -
5. Android 4.0新增的網(wǎng)格布局GridLayout

GridLayoutAndroid4.0增加的網(wǎng)格布局控件,與之前的TableLayout有些相似,它把整個(gè)容器劃分為rows × columns個(gè)網(wǎng)格,每個(gè)網(wǎng)格可以放置一個(gè)組件。性能及功能都要比tablelayout好,比如GridLayout布局中的單元格可以跨越多行,而tablelayout則不行,此外,其渲染速度也比tablelayout要快。

GridLayout提供了setRowCount(int)setColumnCount(int)方法來(lái)控制該網(wǎng)格的行和列的數(shù)量。

GridLayout常用的XML屬性和方法說(shuō)明:

XML屬性 相關(guān)方法 說(shuō)明
android:alignmentMode setAlignmentMode(int) 設(shè)置該布局管理器采用的對(duì)齊模式
android:columnCount setColumnCount(int) 設(shè)置該網(wǎng)格的列數(shù)量
android:columnOrderPreserved setColumnOrderPreserved(boolean) 設(shè)置該網(wǎng)格容器是否保留序列號(hào)
android:roeCount setRowCount(int) 設(shè)置該網(wǎng)格的行數(shù)量
android:rowOrderPreserved setRowOrderPreserved(boolean) 設(shè)置該網(wǎng)格容器是否保留行序號(hào)
android:useDefaultMargins setUseDefaultMargins(boolean) 設(shè)置該布局管理器是否使用默認(rèn)的頁(yè)邊距

為了控制GridLayout布局容器中各子組件的布局分布,GridLayout提供了一個(gè)內(nèi)部類:GridLayout.LayoutParams,來(lái)控制Gridlayout布局容器中子組件的布局分布。

XML屬性 說(shuō)明
android:layout_column 設(shè)置該組件在GridLayout的第幾列
android:layout_columnSpan 設(shè)置該子組件在GridLayout橫向上跨幾列
android:layout_gravity 設(shè)置該子組件采用何種方式占據(jù)該網(wǎng)格的空間
android:layout_row 設(shè)置該子組件在GridLayout的第幾行
android:layout_rowSpan 設(shè)置該子組件在GridLayout縱向上跨幾行
6. AbsoluteLayout絕對(duì)布局

Android不提供任何布局控制,而是由開(kāi)發(fā)人員自己通過(guò)X坐標(biāo)、Y坐標(biāo)來(lái)控制組件的位置。每個(gè)組件都可指定如下兩個(gè)XML屬性:

  • layour_x;
  • layout_y;

絕對(duì)布局已經(jīng)過(guò)時(shí),不應(yīng)使用或少使用。

界面布局類型的選擇和性能優(yōu)化

首先得明確,界面布局類型的嵌套越多越深越復(fù)雜,會(huì)使布局實(shí)例化變慢,使Activity的展開(kāi)時(shí)間延長(zhǎng)。建議盡量減少布局嵌套,盡量減少創(chuàng)建View對(duì)象的數(shù)量。

1 . 減少布局層次,可考慮用RelativeLayout來(lái)代替LinearLayout。通過(guò)Relative的相對(duì)其他元素的位置來(lái)布局,可減少塊狀嵌套;

2 . 另一種減少布局層次的技巧是使用 <merge />標(biāo)簽來(lái)合并布局;

3 . 重用布局。Android支持在XML中使用 <include />標(biāo)簽, <include />通過(guò)指定android:layout屬性來(lái)指定要包含的另一個(gè)XML布局。
如:

<include android:id="@+id/id1" android:layout="@layout/mylayout">
<include android:id="@+id/id2" android:layout="@layout/mylayout">
<include android:id="@+id/id3" android:layout="@layout/mylayout">

三.五大存儲(chǔ):

Android中,可供選擇的存儲(chǔ)方式有SharedPreferences、文件存儲(chǔ)、SQLite數(shù)據(jù)庫(kù)方式、內(nèi)容提供器(Content provider)和網(wǎng)絡(luò)。

1.SharedPreferences方式

Android提供用來(lái)存儲(chǔ)一些簡(jiǎn)單的配置信息的一種機(jī)制,例如,一些默認(rèn)歡迎語(yǔ)、登錄的用戶名和密碼等。其以鍵值對(duì)的方式存儲(chǔ),使得我們可以很方便的讀取和存入.

保存:

 @Override   
    protected void onStop(){   
        super.onStop();   
          
        SharedPreferences settings = getSharedPreferences(SETTING_INFOS, 0); //首先獲取一個(gè)SharedPreferences對(duì)象   
        settings.edit()   
                .putString(NAME, field_name.getText().toString())   
                .putString(PASSWORD, filed_pass.getText().toString())   
                .commit();   
    } //將用戶名和密碼保存進(jìn)去   ```
獲取:

SharedPreferences settings = getSharedPreferences(SETTING_INFOS, 0); //獲取一個(gè)SharedPreferences對(duì)象
String name = settings.getString(NAME, ""); //取出保存的NAME
String password = settings.getString(PASSWORD, ""); //取出保存的PASSWORD

 **注意**:`Preferences`只能在同一個(gè)包內(nèi)使用,不能在不同的包之間使用。

######2.文件存儲(chǔ)方式

在`Android`中,其提供了`openFileInput` 和 `openFileOuput `方法讀取設(shè)備上的文件,下面看個(gè)例子代碼,具體如下所示: 
             `String FILE_NAME = "tempfile.tmp";`  //確定要操作文件的文件名
             `FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); `//初始化
             `FileInputStream fis = openFileInput(FILE_NAME);` //創(chuàng)建寫入流

   上述代碼中兩個(gè)方法只支持讀取該應(yīng)用目錄下的文件,讀取非其自身目錄下的文件將會(huì)拋出異常。需要提醒的是,如果調(diào)用

`FileOutputStream` 時(shí)指定的文件不存在,`Android` 會(huì)自動(dòng)創(chuàng)建它。另外,在默認(rèn)情況下,寫入的時(shí)候會(huì)覆蓋原文件內(nèi)容,如果想把

新寫入的內(nèi)容附加到原文件內(nèi)容后,則可以指定其模式為`Context.MODE_APPEND`。
######3.**SQLite[數(shù)據(jù)庫(kù)](http://lib.csdn.net/base/14)方式**
` SQLite`是`Android`所帶的一個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù),它支持SQL語(yǔ)句,它是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)。

/*

  • 什么是SQLiteDatabase?
  • 一個(gè)SQLiteDatabase的實(shí)例代表了一個(gè)SQLite的數(shù)據(jù)庫(kù),通過(guò)SQLiteDatabase實(shí)例的一些方法,我們可以執(zhí)行SQL語(yǔ)句,
  • 對(duì)數(shù)據(jù)庫(kù)進(jìn)行增、刪、查、改的操作。需要注意的是,數(shù)據(jù)庫(kù)對(duì)于一個(gè)應(yīng)用來(lái)說(shuō)是私有的,并且在一個(gè)應(yīng)用當(dāng)中,數(shù)據(jù)庫(kù)的名字也是惟一的。
    */

/*

  • 什么是SQLiteOpenHelper ?
  • 這個(gè)類主要生成一個(gè)數(shù)據(jù)庫(kù),并對(duì)數(shù)據(jù)庫(kù)的版本進(jìn)行管理。
  • 當(dāng)在程序當(dāng)中調(diào)用這個(gè)類的方法getWritableDatabase()或者getReadableDatabase()方法的時(shí)候,如果當(dāng)時(shí)沒(méi)有數(shù)據(jù),那么Android系統(tǒng)就會(huì)自動(dòng)生成一個(gè)數(shù)據(jù)庫(kù)。
  • SQLiteOpenHelper 是一個(gè)抽象類,我們通常需要繼承它,并且實(shí)現(xiàn)里邊的3個(gè)函數(shù),
  • onCreate(SQLiteDatabase):在數(shù)據(jù)庫(kù)第一次生成的時(shí)候會(huì)調(diào)用這個(gè)方法,一般我們?cè)谶@個(gè)方法里邊生成數(shù)據(jù)庫(kù)表。 
    
  • onUpgrade(SQLiteDatabase, int, int):當(dāng)數(shù)據(jù)庫(kù)需要升級(jí)的時(shí)候,Android系統(tǒng)會(huì)主動(dòng)的調(diào)用這個(gè)方法。一般我們?cè)谶@個(gè)方法里邊刪除數(shù)據(jù)表,并建立新的數(shù)據(jù)表,當(dāng)然是否還需要做其他的操作,完全取決于應(yīng)用的需求。 
    
  • onOpen(SQLiteDatabase):這是當(dāng)打開(kāi)數(shù)據(jù)庫(kù)時(shí)的回調(diào)函數(shù),一般也不會(huì)用到。  
    

*/

(1)建立一個(gè)內(nèi)部類,主要生成一個(gè)數(shù)據(jù)庫(kù)   

private static class DatabaseHelper extends SQLiteOpenHelper {

    DatabaseHelper(Context context) {  
        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    }  

    //在數(shù)據(jù)庫(kù)第一次生成的時(shí)候會(huì)調(diào)用這個(gè)方法,一般我們?cè)谶@個(gè)方法里邊生成數(shù)據(jù)庫(kù)表。   
    @Override  
    public void onCreate(SQLiteDatabase db) {  

        String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE  
                + " text not null, " + BODY + " text not null " + ");";  
        Log.i("haiyang:createDB=", sql);  
        db.execSQL(sql);  
    }  

    @Override  
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
    }  
}  ```

(2)重新建立數(shù)據(jù)表

 private void CreateTable() {  
        //mOpenHelper.getWritableDatabase()語(yǔ)句負(fù)責(zé)得到一個(gè)可寫的SQLite數(shù)據(jù)庫(kù),如果這個(gè)數(shù)據(jù)庫(kù)還沒(méi)有建立,  
        //那么mOpenHelper輔助類負(fù)責(zé)建立這個(gè)數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)已經(jīng)建立,那么直接返回一個(gè)可寫的數(shù)據(jù)庫(kù)。  
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
        String sql = "CREATE TABLE " + TABLE_NAME + " (" + TITLE  
                + " text not null, " + BODY + " text not null " + ");";  
        Log.i("haiyang:createDB=", sql);  
  
        try {  
            db.execSQL("DROP TABLE IF EXISTS diary");  
            db.execSQL(sql);  
            setTitle("數(shù)據(jù)表成功重建");  
        } catch (SQLException e) {  
            setTitle("數(shù)據(jù)表重建錯(cuò)誤");  
        }  
    }  ```
(3)刪除數(shù)據(jù)表 

private void dropTable() {
//mOpenHelper.getWritableDatabase()語(yǔ)句負(fù)責(zé)得到一個(gè)可寫的SQLite數(shù)據(jù)庫(kù),如果這個(gè)數(shù)據(jù)庫(kù)還沒(méi)有建立,
//那么mOpenHelper輔助類負(fù)責(zé)建立這個(gè)數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)已經(jīng)建立,那么直接返回一個(gè)可寫的數(shù)據(jù)庫(kù)。
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
String sql = "drop table " + TABLE_NAME;
try {
db.execSQL(sql);
setTitle("數(shù)據(jù)表成功刪除:" + sql);
} catch (SQLException e) {
setTitle("數(shù)據(jù)表刪除錯(cuò)誤");
}
} ```
(4)插入兩條數(shù)據(jù)

 private void insertItem() {  
        //mOpenHelper.getWritableDatabase()語(yǔ)句負(fù)責(zé)得到一個(gè)可寫的SQLite數(shù)據(jù)庫(kù),如果這個(gè)數(shù)據(jù)庫(kù)還沒(méi)有建立,  
        //那么mOpenHelper輔助類負(fù)責(zé)建立這個(gè)數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)已經(jīng)建立,那么直接返回一個(gè)可寫的數(shù)據(jù)庫(kù)。  
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();  
        String sql1 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY  
                + ") values('haiyang', 'android的發(fā)展真是迅速啊');";  
        String sql2 = "insert into " + TABLE_NAME + " (" + TITLE + ", " + BODY  
                + ") values('icesky', 'android的發(fā)展真是迅速啊');";  
        try {  
            // Log.i()會(huì)將參數(shù)內(nèi)容打印到日志當(dāng)中,并且打印級(jí)別是Info級(jí)別  
            // Android支持5種打印級(jí)別,分別是Verbose、Debug、Info、Warning、Error,當(dāng)然我們?cè)诔绦虍?dāng)中一般用到的是Info級(jí)別  
            Log.i("haiyang:sql1=", sql1);  
            Log.i("haiyang:sql2=", sql2);  
            db.execSQL(sql1);  
            db.execSQL(sql2);  
            setTitle("插入兩條數(shù)據(jù)成功");  
        } catch (SQLException e) {  
            setTitle("插入兩條數(shù)據(jù)失敗");  
        }  
    }  ```
(5)刪除其中的一條數(shù)據(jù) 

private void deleteItem() {
try {
//mOpenHelper.getWritableDatabase()語(yǔ)句負(fù)責(zé)得到一個(gè)可寫的SQLite數(shù)據(jù)庫(kù),如果這個(gè)數(shù)據(jù)庫(kù)還沒(méi)有建立,
//那么mOpenHelper輔助類負(fù)責(zé)建立這個(gè)數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)已經(jīng)建立,那么直接返回一個(gè)可寫的數(shù)據(jù)庫(kù)。
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
//第一個(gè)參數(shù)是數(shù)據(jù)庫(kù)表名,在這里是TABLE_NAME,也就是diary。
//第二個(gè)參數(shù),相當(dāng)于SQL語(yǔ)句當(dāng)中的where部分,也就是描述了刪除的條件。
//如果在第二個(gè)參數(shù)當(dāng)中有“?”符號(hào),那么第三個(gè)參數(shù)中的字符串會(huì)依次替換在第二個(gè)參數(shù)當(dāng)中出現(xiàn)的“?”符號(hào)。
db.delete(TABLE_NAME, " title = 'haiyang'", null);
setTitle("刪除title為haiyang的一條記錄");
} catch (SQLException e) {

    }  

}  ```

(6)查詢數(shù)據(jù)

    /* 
     * Cursor cur = db.query(TABLE_NAME, col, null, null, null, null, null)語(yǔ)句將查詢到的數(shù)據(jù)放到一個(gè)Cursor 當(dāng)中。 
        這個(gè)Cursor里邊封裝了這個(gè)數(shù)據(jù)表TABLE_NAME當(dāng)中的所有條列。  
        query()方法相當(dāng)?shù)挠杏?,在這里我們簡(jiǎn)單地講一下。 
            第一個(gè)參數(shù)是數(shù)據(jù)庫(kù)里邊表的名字,比如在我們這個(gè)例子,表的名字就是TABLE_NAME,也就是"diary"。 
            第二個(gè)字段是我們想要返回?cái)?shù)據(jù)包含的列的信息。在這個(gè)例子當(dāng)中我們想要得到的列有title、body。我們把這兩個(gè)列的名字放到字符串?dāng)?shù)組里邊來(lái)。 
            第三個(gè)參數(shù)為selection,相當(dāng)于SQL語(yǔ)句的where部分,如果想返回所有的數(shù)據(jù),那么就直接置為null。 
            第四個(gè)參數(shù)為selectionArgs。在selection部分,你有可能用到“?”,那么在selectionArgs定義的字符串會(huì)代替selection中的“?”。 
            第五個(gè)參數(shù)為groupBy。定義查詢出來(lái)的數(shù)據(jù)是否分組,如果為null則說(shuō)明不用分組。 
            第六個(gè)參數(shù)為having ,相當(dāng)于SQL語(yǔ)句當(dāng)中的having部分。 
            第七個(gè)參數(shù)為orderBy,來(lái)描述我們期望的返回值是否需要排序,如果設(shè)置為null則說(shuō)明不需要排序。 
     */  
      
    private void showItems() {  
  
        SQLiteDatabase db = mOpenHelper.getReadableDatabase();  
        String col[] = { TITLE, BODY };  
        //查詢數(shù)據(jù)  
        Cursor cur = db.query(TABLE_NAME, col, null, null, null, null, null);  
        Integer num = cur.getCount();  
        setTitle(Integer.toString(num) + " 條記錄");  
    }  ```
######4.內(nèi)容提供器(Content provider)方式
  在`Android`的設(shè)計(jì)“哲學(xué)”里是鼓勵(lì)開(kāi)發(fā)者使用內(nèi)部類的,這樣不但使用方便,而且執(zhí)行效率也高。

   (1).什么是`ContentProvider `

   數(shù)據(jù)在`Android`當(dāng)中是私有的,當(dāng)然這些數(shù)據(jù)包括文件數(shù)據(jù)和數(shù)據(jù)庫(kù)數(shù)據(jù)以及一些其他類型的數(shù)據(jù)。難道兩個(gè)程序之間就沒(méi)有辦法對(duì)于數(shù)據(jù)進(jìn)行交換?解決這個(gè)問(wèn)題主要靠`ContentProvider`。
 一個(gè)`Content Provider`類實(shí)現(xiàn)了一組標(biāo)準(zhǔn)的方法接口,從而能夠讓其他的應(yīng)用保存或讀取此`Content Provider`的各種數(shù)據(jù)類型。也就是說(shuō),一個(gè)程序可以通過(guò)實(shí)現(xiàn)一個(gè)`Content Provider`的抽象接口將自己的數(shù)據(jù)暴露出去。外界根本看不到,也不用看到這個(gè)應(yīng)用暴露的數(shù)據(jù)在應(yīng)用當(dāng)中是如何存儲(chǔ)的,或者是用數(shù)據(jù)庫(kù)存儲(chǔ)還是用文件存儲(chǔ),還是通過(guò)網(wǎng)上獲得,這些一切都不重要,重要的是外界可以通過(guò)這一套標(biāo)準(zhǔn)及統(tǒng)一的接口和程序里的數(shù)據(jù)打交道,可以讀取程序的數(shù)據(jù),也可以刪除程序的數(shù)據(jù),當(dāng)然,中間也會(huì)涉及一些權(quán)限的問(wèn)題。
      下邊列舉一些較常見(jiàn)的接口,這些接口如下所示。
    `  query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder)`:通過(guò)Uri進(jìn)行查詢,返回一個(gè)`Cursor`。 
     ` insert(Uri url, ContentValues values)`:將一組數(shù)據(jù)插入到Uri 指定的地方。 
     ` update(Uri uri, ContentValues values, String where, String[] selectionArgs)`:更新Uri指定位置的數(shù)據(jù)。 
      `delete(Uri url, String where, String[] selectionArgs)`:刪除指定Uri并且符合一定條件的數(shù)據(jù)。

   (2).什么是`ContentResolver`
      外界的程序通過(guò)`ContentResolver`接口可以訪問(wèn)`ContentProvider`提供的數(shù)據(jù),在`Activity`當(dāng)中通過(guò)`getContentResolver()`可以得到當(dāng)前應(yīng)用的`ContentResolver`實(shí)例。
      `ContentResolver`提供的接口和`ContentProvider`中需要實(shí)現(xiàn)的接口對(duì)應(yīng),主要有以下幾個(gè)。 
      `query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder`):通過(guò)Uri進(jìn)行查詢,返回一個(gè)`Cursor`。
      `insert(Uri url, ContentValues values)`:將一組數(shù)據(jù)插入到Uri 指定的地方。
      `update(Uri uri, ContentValues values, String where, String[] selectionArgs)`:更新Uri指定位置的數(shù)據(jù)。
      `delete(Uri url, String where, String[] selectionArgs)`:刪除指定Uri并且符合一定條件的數(shù)據(jù)。

   (3).`ContentProvider`和`ContentResolver`中用到的Uri 
      在`ContentProvider`和`ContentResolver`當(dāng)中用到了Uri的形式通常有兩種,一種是指定全部數(shù)據(jù),另一種是指定某個(gè)ID的數(shù)據(jù)。
     我們看下面的例子。 
          `content://contacts/people/ ` 這個(gè)Uri指定的就是全部的聯(lián)系人數(shù)據(jù)。
         ` content://contacts/people/1 `這個(gè)Uri指定的是ID為1的聯(lián)系人的數(shù)據(jù)。 

   在上邊兩個(gè)類中用到的Uri一般由3部分組成。
         第一部分是:`"content://" `。
         第二部分是要獲得數(shù)據(jù)的一個(gè)字符串片段。 
        最后就是ID(如果沒(méi)有指定ID,那么表示返回全部)。

   由于URI通常比較長(zhǎng),而且有時(shí)候容易出錯(cuò),且難以理解。所以,在`Android`當(dāng)中定義了一些輔助類,并且定義了一些常量來(lái)代替這些長(zhǎng)字符串的使用,例如下邊的代碼: 
  `   Contacts.People.CONTENT_URI `(聯(lián)系人的URI)。

  (4)實(shí)現(xiàn)的功能

   在這個(gè)例子里邊,首先在系統(tǒng)的聯(lián)系人應(yīng)用當(dāng)中插入一些聯(lián)系人信息,然后把這些聯(lián)系人的名字和電話再顯示出來(lái)

 (5)實(shí)現(xiàn)方法

  protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        //getContentResolver()方法得到應(yīng)用的ContentResolver實(shí)例。  
        // query(Phones.CONTENT_URI, null, null, null, null)。它是ContentResolver里的方法,負(fù)責(zé)查詢所有聯(lián)系人,并返回一個(gè)Cursor。這個(gè)方法參數(shù)比較多,每個(gè)參數(shù)的具體含義如下。  
        //·  第一個(gè)參數(shù)為Uri,在這個(gè)例子里邊這個(gè)Uri是聯(lián)系人的Uri。  
        //·  第二個(gè)參數(shù)是一個(gè)字符串的數(shù)組,數(shù)組里邊的每一個(gè)字符串都是數(shù)據(jù)表中某一列的名字,它指定返回?cái)?shù)據(jù)表中那些列的值。  
        //·  第三個(gè)參數(shù)相當(dāng)于SQL語(yǔ)句的where部分,描述哪些值是我們需要的。  
        //·  第四個(gè)參數(shù)是一個(gè)字符串?dāng)?shù)組,它里邊的值依次代替在第三個(gè)參數(shù)中出現(xiàn)的“?”符號(hào)。  
        //·  第五個(gè)參數(shù)指定了排序的方式。  
        Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);  
        startManagingCursor(c); //讓系統(tǒng)來(lái)管理生成的Cursor。  
        ListAdapter adapter = new SimpleCursorAdapter(  
                this,  
                android.R.layout.simple_list_item_2,   
                c,   
                new String[] { Phones.NAME, Phones.NUMBER },   
                new int[] { android.R.id.text1, android.R.id.text2 });  
        setListAdapter(adapter); //將ListView和SimpleCursorAdapter進(jìn)行綁定。  
    }  ```
######5. 網(wǎng)絡(luò)存儲(chǔ)方式
簡(jiǎn)單講就是把一段數(shù)據(jù)通過(guò)POST發(fā)送的方式保存到服務(wù)器,要用到的時(shí)候在去服務(wù)器中請(qǐng)求拿到數(shù)據(jù)。

查看原文請(qǐng)點(diǎn)擊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容