Android開發(fā)之?dāng)?shù)據(jù)的存儲方式詳解
在Android中,數(shù)據(jù)的存儲分為兩種方式:
1、直接以文件的形式存儲在目錄中
2、以json格式存儲在數(shù)據(jù)庫中
將數(shù)據(jù)以文件的存儲又分為兩種方式:
1、生成.txt文件
2、生成xml文件
那么今天就來詳細的說一下以文件的形式存儲,由于沒有講到數(shù)據(jù)庫,在之后的課程中會講到j(luò)son格式存儲在數(shù)據(jù)庫中。
一、生成.txt文件
文件的生成無非就是我們Java中學(xué)習(xí)的輸入輸出流中的一部分,有Java基礎(chǔ)相信都是很容易理解的,因為它真的很簡單啦~~
1、生成目錄可以分為兩種:
1)本機
2)SD卡
2、生成.txt文件的方式又可以分為4種
1)使用MODE_PRIVATE模式,生成一個私有的文件
2)使用MODE_PRIVATE模式,生成一個appent文件
3)使用MODE_WORLD_READABLE模式,生成一個readable文件
4)使用MODE_WORLD_WRITEABLE模式,生成一個writeable文件
在生.txt文件之前,我們有必要先了解一下文件的權(quán)限,如下圖:
1、第一格:表示文件的類型
2、第2-4格:表示當(dāng)前用戶擁有的權(quán)限
3、第5-7格:表示當(dāng)前用戶所在組擁有的權(quán)限
4、第8-10格:表示其他用戶擁有的權(quán)限
5、"r":表示可讀;"w":表示可寫;"x":表示可執(zhí)行;"-":表示什么權(quán)限也沒有,如果看到"rwx"就表示可讀可寫可執(zhí)行,其他組合亦是如此
注意:不同的模式生成的文件的權(quán)限是不一樣的,以及生成文件的類型的權(quán)限也是不一樣的。
那么下面就詳細的來說一下這幾種方式
1、如圖所示,當(dāng)我們點擊button按鈕時觸發(fā)文件的監(jiān)聽,這里的按鈕就是簡單的按鈕,但是要記得設(shè)置onclick點擊事件的屬性哦~大家都不傻是吧…………
1)使用MODE_PRIVATE模式,生成一個私有的文件
//點擊按鈕1,使用MODE_PRIVATE模式,生成一個私有的文件 public void click1(View v){ try { FileOutputStream fos = openFileOutput("private.txt", MODE_PRIVATE); fos.write("private".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
2)使用MODE_PRIVATE模式,生成一個appent文件
//點擊按鈕2,使用MODE_PRIVATE模式,生成一個appent文件 public void click2(View v){ try { FileOutputStream fos = openFileOutput("appent.txt", MODE_PRIVATE); fos.write("appent".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
3)使用MODE_WORLD_READABLE模式,生成一個readable文件
//點擊按鈕3,使用MODE_WORLD_READABLE模式,生成一個readable文件 public void click3(View v){ try { FileOutputStream fos = openFileOutput("readable.txt", MODE_WORLD_READABLE); fos.write("readable".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
4)使用MODE_WORLD_WRITEABLE模式,生成一個writeable文件
//點擊按鈕4,使用MODE_WORLD_WRITEABLE模式,生成一個write文件 public void click4(View v){ try { FileOutputStream fos = openFileOutput("writeable.txt", MODE_WORLD_WRITEABLE); fos.write("writeable".getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
部分代碼說明
FileOutputStream: 文件輸出流
openFileOutput("private.txt", MODE_PRIVATE):openFileOutput是Android中封裝好的文件輸出流,private.txt就是生成的文件名,MODE_PRIVATE這個就是上面說到的模式啦!
fos.write("private".getBytes()):write就是寫入什么內(nèi)容,這里的參數(shù)就是你要寫入的文本內(nèi)容,getBytes()………………^_^不知道自己去看Java基礎(chǔ)吧哈哈哈~~~
close():關(guān)閉流對象
try-catch:有異常,try一下……
MODE_WORLD_WRITEABLE,MODE_WORLD_READABLE:這兩個模式已經(jīng)被廢棄了……沒有那么多為什么!哈哈哈……
感覺自己萌萌噠……實在不會的就復(fù)習(xí)Java基礎(chǔ)吧!
那么這里就生成了如下圖所示的4個文件
2、將文件存儲在SD卡
1、獲取SD卡的路徑:
String sdPath = Environment.getExternalStorageDirectory().getPath() ;
2、添加路徑
File file = new File(sdPath + "writeable.txt");
然后將路徑寫成這個就好了!就是這么簡單
3、讀取剛才寫入的文件
在讀取文件內(nèi)容的時候,你寫入的路徑是什么,那么讀的時候路徑就是什么
try { //File file = new File("/data/data/com.test.filereadwrite/files/readable.txt"); File file = new File("/data/data/com.test.filereadwrite/files/writeable.txt"); FileInputStream fis = new FileInputStream(file); BufferedReader bffr = new BufferedReader(new InputStreamReader(fis)); String content = bffr.readLine(); Toast.makeText(MainActivity.this, content, 2000).show(); } catch (Exception e) { e.printStackTrace(); }
4、路徑優(yōu)化
大家偶發(fā)現(xiàn)了我這里是直接寫的路徑,那么這樣寫并不是最優(yōu)化的,那么要怎么才是更優(yōu)化的呢,那么久只要改兩行代碼就好啦,例如:
1、獲取路徑:
String path = Context.getFilesDir().getPath();
2、添加路徑:
File file = new File(path + "writeable.txt");
注意:我們寫的路徑都應(yīng)該是用優(yōu)化的這種方式,而不應(yīng)該寫死,在這里我為了殺雞儆猴哈哈哈~所以就寫死了……但是效果都是一樣的哇~~
二、生成xml文件
生成xml文件又可以分為兩種方式:
1、使用原生StringBuffer拼接xml文件
2、使用Android封裝好的XmlPullParser類
兩種方式生成的xml文件是一樣的,但是個人比較喜歡第二種方式,因為簡單,就是簡單,簡單到Google工程師在開發(fā)文檔中都不用寫實例代碼……
在生成xml之前,大家先不要忘記了寫一個實體類,不然你怎么封裝數(shù)據(jù)?告訴我怎么封裝…………
那么我們這里就直接上代碼了(實體類自己寫……)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化我們要備份的數(shù)據(jù) smsLists = new ArrayList<Sms>(); //插入測試數(shù)據(jù) for (int i = 0; i < 10; i++) { Sms sms = new Sms(); sms.setAddress("10086"+i); sms.setBody("你好"+i); sms.setDate("201"+i); //把sms對象加入到集合中 smsLists.add(sms); } }
1、使用原生StringBuffer拼接xml文件
//點擊按鈕button1,通過StringBuffer的方式生成一個xml文件 public void click1(View v){ //1創(chuàng)建一個StringBuffer對象 StringBuffer sb = new StringBuffer(); //開始組拼xml文件頭 sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); //開始組拼xml根節(jié)點 sb.append("<smss>"); //開始組拼sms節(jié)點以及子節(jié)點 for (Sms sms : smsLists) { sb.append("<sms>"); //組拼addressa節(jié)點 sb.append("<address>"); sb.append(sms.getAddress()); sb.append("</address>"); //組拼body節(jié)點 sb.append("<body>"); sb.append(sms.getBody()); sb.append("</body>"); //組拼date節(jié)點 sb.append("<date>"); sb.append(sms.getDate()); sb.append("</date>"); sb.append("</sms>"); } //smss節(jié)點結(jié)束 sb.append("</smss>"); //把數(shù)據(jù)保存到SD卡中 try { File file = new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml"); FileOutputStream fos = new FileOutputStream(file); fos.write(sb.toString().getBytes()); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
2、使用Android封裝好的XmlPullParser類
//點擊按鈕button2,通過XmlSerializer的方式生成xml文件 public void click2(View v){ try { //獲取XmlSerializer類的實例 通過xml這個工具類去獲取 XmlSerializer serializer = Xml.newSerializer(); //設(shè)置XmlSerializer序列化參數(shù) File file = new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml"); FileOutputStream fos = new FileOutputStream(file); serializer.setOutput(fos,"utf-8"); //開始寫xml文檔開頭 serializer.startDocument("utf-8", true); //寫xml的根節(jié)點 namespace 命名空間 serializer.startTag(null, "smss"); //遍歷sms節(jié)點以及子節(jié)點 for (Sms sms : smsLists) { serializer.startTag(null, "sms"); //組拼addressa節(jié)點 serializer.startTag(null, "address"); serializer.text(sms.getAddress()); serializer.endTag(null, "address"); //組拼body節(jié)點 serializer.startTag(null, "body"); serializer.text(sms.getBody()); serializer.endTag(null, "body"); //組拼date節(jié)點 serializer.startTag(null, "date"); serializer.text(sms.getDate()); serializer.endTag(null, "date"); serializer.endTag(null, "sms"); } serializer.endTag(null, "smss"); //結(jié)束xml結(jié)尾 serializer.endDocument(); //關(guān)閉流 fos.close(); } catch (Exception e) { e.printStackTrace(); } }
那么這里就生成如下圖的xml文件:
3、讀取xml文件中的數(shù)據(jù)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { //顯示數(shù)據(jù)信息 TextView tv_sms = (TextView) findViewById(R.id.tv_weather); //通過上下文 獲取資產(chǎn)的管理者 InputStream in = getAssets().open("smss.xml"); //調(diào)用我們定義 解析xml的業(yè)務(wù)方法 List<Sms> smsLists = SmsParser.xmlParser(in); StringBuffer sb = new StringBuffer(); for (Sms sms : smsLists) { sb.append(sms.toString()); } //把數(shù)據(jù)顯示到TextView上 tv_sms.setText(sb.toString()); } catch (Exception e) { e.printStackTrace(); } }
部分代碼說明:
這里我想教大家自己怎么去看開發(fā)文檔……所以大家自己去看開發(fā)文檔吧……哈哈哈~~
ps:這里我想說明一下,不是我不會,也不是偷懶,而是大家在以后企業(yè)開發(fā)的時候都是可以查看開發(fā)文檔的,而且說實話Android中的東西真的很多很多,要全部記住那簡直太難啦……
所以希望大家都能夠自己學(xué)會查看開發(fā)文檔……這也算是自己必修的一門課吧~~因為對于小白的我,學(xué)會了看文檔就免得很多很多的麻煩,比如突然有一個東東不會……怎么辦?哈哈哈……
三、總結(jié)
1、生成.txt文件的4種方法和步驟
2、生成xml文件的2種方法和步驟
3、讀取.txt文件
4、讀取xml文件
5、將數(shù)據(jù)存放在本機和SD卡中
6、學(xué)會看開發(fā)文檔
7、文件權(quán)限
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android RecyclerView item選中放大被遮擋問題詳解
這篇文章主要介紹了Android RecyclerView item選中放大被遮擋問題詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04android 網(wǎng)絡(luò)請求庫volley方法詳解
這篇文章主要介紹了android 網(wǎng)絡(luò)請求庫volley方法詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09android 選項卡(TabHost)如何放置在屏幕的底部
如何將TAB放置在屏幕的底端,有很多的新手都想實現(xiàn)這種效果,本文搜集整理了一些,感興趣的朋友可以參考下哦2013-01-01Android ContentProvider獲取手機聯(lián)系人實例
這篇文章主要介紹了Android ContentProvider獲取手機聯(lián)系人實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02