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文檔解析結束。