天天看點

筆記 - Android - 5.資料存儲和通路、XML等

android -- 資料存儲和通路:

android下的檔案通路權限:

    r:readable可讀

    w:writeable可寫

    x:可執行

    permissions(權限):

        - --- --- ---

    第一(位置0)表示檔案或目錄

        > - 表示檔案

        > d 表示目錄

    第2~4(位置1~3)表示目前使用者對檔案所具有的權限

    第5~7(位置4~6)表示目前使用者所在組對檔案所具有的權限

    第8~10(位置7~9)表示其他使用者對該檔案所具有的權限

    目前使用者:每一個不同的應用程式都對應一個不同的使用者,該使用者就是該應用程式的目前使用者

    目前使用者組:目前使用者所在的組

        通常情況下,android下的每一個應用程式都對應一個獨立的使用者,都對應一個獨立的使用者組

    其他使用者:除了應用程式自身對應的使用者之外,其他的應用程式所對應的使用者都稱之為其他使用者

    linux chmod指令:chmod -> change mode 改變模式的意思,該linux指令可以用來改變一個檔案的權限

        用法:chmod 參數 檔案名

            參數:該參數是一個二進制數的十進制表現形式,該二進制表示的是檔案的權限,10個位置,不算第一位,

                有權限用1表示,無權限則用0表示,每三位一組,每組二進制數的十進制連起來則是該參數。

                如: - rwx rw- --- 該權限的二進制表示為

                      111 110 000 對應的十進制則為

                       7   6   0  連起來就是 760,760就是該參數

一、儲存檔案到手機記憶體

    sharedpreferences的使用:該對象可以用來儲存資料資訊,最終會在程式資料目錄下生成一個shared_prefs檔案夾,

        shared_prefs檔案夾下會生成一個xml配置檔案,資料就儲存在這個xml檔案中。

        使用sharedpreferences存資料:

            1.建立對象,通過上下文的getsharedpreferences(string name, int mode) 方法獲得一個shardpreferences對象,

            2.建立一個編輯器對象editor,通過sharedpreferences對象的edit()方法,

            3.使用編輯器對象存入資料,通過調用editor.putxxx(key, value)方法,

                putxxx()方法有

                putstring(string key, string value),

                putboolean(string key, boolean value),

                putfloat(string key, float value),

                putlong(string key, long value),

                putstringset(string key, set<string> value),該方法value是一個set<string>集合

            4.最後一步必不可少,送出資料,調用editor.commit()方法,隻有調用了該方法後,資料才能正确的儲存到shared_prefs檔案夾

                下的xml檔案。

        使用sharedpreferences讀取資料:

            1.建立對象,與上述方法相同,

            2.調用sharedpreferences對象的getxxx(key, defaultvalue)方法

                > string key:存入資料時所使用的key

                > defaultvalue:預設值,當getxxx()方法沒有取到資料時,傳回該預設值。

                > getxxx()方法有:

                    getstring(string key, string defvalue)

                    getboolean(string key, boolean delvalue)

                    getlong(string key, long delvalue)

                    getfloat(string key, float defvalue)

                    getstringset(string key, set<string> defvalue)

                與editor對象的putxxx()方法對應。

二、儲存檔案到手機sd卡

    environment的使用:環境,一個靜态工具類,可以操作外部儲存設備sd卡,無序建立對象。

    将資料存儲到sd卡:

    1.判斷外部儲存設備是否可用

        外部儲存設備狀态常量:

            string environment.media_mounted :外部儲存設備狀态可用

            string environment.media_unmounted:外部儲存設備狀态不可用

        方法:

            static string environment.getexternalstoragestate():傳回目前外部儲存設備的狀态(可用或不可用);

    2.擷取外部儲存設備的路徑

            file environment.getexternalstoragedirectory():傳回外部儲存設備的跟目錄的file對象;

    3.使用外部儲存設備時,需要添加android.permission.write_external_storage 權限

三、生成xml的兩種方式

    1.使用stringbuffer類拼接字元串,以流的形式将xml檔案寫出;

    2.使用xmlserializer類生成xml檔案,該方法内部也是以流的方式生成xml檔案:

        * 建立xmlserializer對象:

            通過xml.newserializer()方法即可建立一個xmlserializer對象,xml是一個xml相關的工具類。

            xmlserializer serializer = xml.newserializer();

        * 設定xmlserializer的輸出流參數,可以是位元組流和字元流

            serializer.setoutput(outputstream os, string encoding);

            或serializer.setoutput(writer wirter);

        * 開始文檔

            serializer.startdocument(string encoding, boolean standalone);

                > encoding:xml檔案聲明所用的編碼

                > standalone:該xml檔案是否是單獨的xml檔案,不受其它xml檔案限制

        * 開始節點

            serializer.starttag(string namespace, string name)

                > namespace:命名空間,通常為null

                > name:節點名稱,不需要尖括号

        * 給節點添加屬性

            serializer.attribute(string namespace, string name, string value)

                > name:屬性名稱

                > value:屬性值

        * 給節點添加内容

            serializer.text(string text)

                > text:需要添加在節點中的文本字元串

        * 結束節點

            serializer.endtag(string name)

                > name:标簽名稱,同starttag()

        * 結束文檔

            serializer.enddocument();

        * 開始節點到結束節點這個步驟可循環!!!

            養成好的習慣,在寫完開始後,立馬把結束寫上,然後在中間寫内容,這樣不容易出錯!!!

四、解析xml文檔

    使用xmlpullparser對象解析xml文檔

    * 建立xmlpullparser對象

        通過xml類的newpullparser()方法即可建立一個xmlpullparser對象

            xmlpullparser parser = xml.newpullparser();

        或者通過一個工廠類也可建立一個xmlpullparser對象:

            xmlpullparserfactory factory = xmlpullparserfactory.newinstance();

            factory.setnamespaceaware(true);

            xmlpullparser xpp = factory.newpullparser();

    * 設定輸入流參數

        流可以是字元流或者位元組流都可

        位元組流:parser.setinput(inputstream in, string encoding)

            > in:對應檔案的位元組輸入流對象

            > encoding:輸入流編碼

        字元流:parser.setinput(reader reader)

            > reader:對應檔案的字元輸入流對象

    * 獲得目前的事件類型

        事件類型:

            該解析xml的過程是自上而下一行一行的解析,

            當指針指在文檔開頭時,對應的事件類型是 start_document,

            當指針指在開始節點處時,對應的事件類型是 start_tag,

            當指針指在結束節點時,對應的事件類型是 end_tag,

            當指針指在文檔結尾時,對應的事件類型是 end_document。

            當指針指在開始标簽和結束标簽之間的文本時,事件類型是 text

        需要用到事件類型常量有:

            ** xmlpullparser.start_document --> 表示文檔的開始

            ** xmlpullparser.end_document --> 表示文檔的結尾

            ** xmlpullparser.start_tag --> 表示一個節點的開始

            ** xmlpullparser.end_tag --> 表示一個節點的結束

            ** xmlpullparser.text --> 表示開始節點和結束節點之間的文本

        int parser.geteventtype():傳回目前的事件類型

    * 循環判斷目前的事件類型,隻要事件類型不等于end_document,就表示沒有解析到文檔的結尾,循環處理操作

        循環中先判斷事件類型是開始節點事件類型還是結束節點事件類型,根據不同對的事件類型做不同的操作。

        操作中常用到的方法:

            parser.getname():傳回目前指針所處的節點名稱,也就是标簽名;

            parser.nexttext():取出目前指針所處節點中的文本内容(開始标簽和結束标簽之間的内容)

            parser.gettext():該方法配合常量text一起使用,隻有當事件類型為text時,才可使用gettext()方法取出

                目前指針所指的文本,取出的值與nexttext()取出的相同。

            parser.getattributevalue(int index):傳回目前指針所指的節點的給定索引的屬性值

                > index:節點中屬性的索引,索引從0開始

            ......

    * 每循環一次,重新擷取目前的事件類型,再次判斷是否循環:

        eventtype = parser.next();

    * 當eventtype == end_document,xml文檔解析結束。

繼續閱讀