Android開發-之數據的存儲方式一


在Android中,數據的存儲分為兩種方式:

  1、直接以文件的形式存儲在目錄中

  2、以json格式存儲在數據庫中

  將數據以文件的存儲又分為兩種方式:

  1、生成.txt文件

  2、生成xml文件

  那么今天就來詳細的說一下以文件的形式存儲,由於沒有講到數據庫,在之后的課程中會講到json格式存儲在數據庫中。

 

一、生成.txt文件

文件的生成無非就是我們Java中學習的輸入輸出流中的一部分,有Java基礎相信都是很容易理解的,因為它真的很簡單啦~~

  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文件之前,我們有必要先了解一下文件的權限,如下圖:

  1、第一格:表示文件的類型

  2、第2-4格:表示當前用戶擁有的權限

  3、第5-7格:表示當前用戶所在組擁有的權限

  4、第8-10格:表示其他用戶擁有的權限

  5、"r":表示可讀;"w":表示可寫;"x":表示可執行;"-":表示什么權限也沒有,如果看到"rwx"就表示可讀可寫可執行,其他組合亦是如此

 

  注意:不同的模式生成的文件的權限是不一樣的,以及生成文件的類型的權限也是不一樣的。

 

  那么下面就詳細的來說一下這幾種方式

  1、如圖所示,當我們點擊button按鈕時觸發文件的監聽,這里的按鈕就是簡單的按鈕,但是要記得設置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就是寫入什么內容,這里的參數就是你要寫入的文本內容,getBytes()………………^_^不知道自己去看Java基礎吧哈哈哈~~~

  
close():關閉流對象
  

try-catch:有異常,try一下……
  
 MODE_WORLD_WRITEABLE,MODE_WORLD_READABLE:這兩個模式已經被廢棄了……沒有那么多為什么!哈哈哈……
  

  感覺自己萌萌噠……實在不會的就復習Java基礎吧!



  那么這里就生成了如下圖所示的4個文件

 

  

 2、將文件存儲在SD卡

    1、獲取SD卡的路徑:
    String sdPath = Environment.getExternalStorageDirectory().getPath() ;
    2、添加路徑
    File file = new File(sdPath + "writeable.txt");

    然后將路徑寫成這個就好了!就是這么簡單

 3、讀取剛才寫入的文件
  在讀取文件內容的時候,你寫入的路徑是什么,那么讀的時候路徑就是什么
 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、路徑優化

  大家偶發現了我這里是直接寫的路徑,那么這樣寫並不是最優化的,那么要怎么才是更優化的呢,那么久只要改兩行代碼就好啦,例如:

  1、獲取路徑:
  String path = Context.getFilesDir().getPath();
  2、添加路徑:
  File file = new File(path + "writeable.txt");

  注意:我們寫的路徑都應該是用優化的這種方式,而不應該寫死,在這里我為了殺雞儆猴哈哈哈~所以就寫死了……但是效果都是一樣的哇~~

二、生成xml文件


  生成xml文件又可以分為兩種方式:

  1、使用原生StringBuffer拼接xml文件

  2、使用Android封裝好的XmlPullParser類
  
  兩種方式生成的xml文件是一樣的,但是個人比較喜歡第二種方式,因為簡單,就是簡單,簡單到Google工程師在開發文檔中都不用寫實例代碼……

  在生成xml之前,大家先不要忘記了寫一個實體類,不然你怎么封裝數據?告訴我怎么封裝…………


  那么我們這里就直接上代碼了(實體類自己寫……)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //初始化我們要備份的數據
        smsLists = new ArrayList<Sms>();
        
        //插入測試數據
        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創建一個StringBuffer對象
        StringBuffer sb = new StringBuffer();
        
        //開始組拼xml文件頭
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        //開始組拼xml根節點
        sb.append("<smss>");
        //開始組拼sms節點以及子節點
        for (Sms sms : smsLists) {
            sb.append("<sms>");
            
            //組拼addressa節點
            sb.append("<address>");
            sb.append(sms.getAddress());
            sb.append("</address>");
            
            //組拼body節點
            sb.append("<body>");
            sb.append(sms.getBody());
            sb.append("</body>");
            
            //組拼date節點
            sb.append("<date>");
            sb.append(sms.getDate());
            sb.append("</date>");
            
            sb.append("</sms>");
        }
        
        //smss節點結束
        sb.append("</smss>");
        
        //把數據保存到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();
            //設置XmlSerializer序列化參數
            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的根節點     namespace 命名空間
            serializer.startTag(null, "smss");
            //遍歷sms節點以及子節點
            for (Sms sms : smsLists) {
                serializer.startTag(null, "sms");
                
                //組拼addressa節點
                serializer.startTag(null, "address");
                serializer.text(sms.getAddress());
                serializer.endTag(null, "address");
                
                //組拼body節點
                serializer.startTag(null, "body");
                serializer.text(sms.getBody());
                serializer.endTag(null, "body");
                
                //組拼date節點
                serializer.startTag(null, "date");
                serializer.text(sms.getDate());
                serializer.endTag(null, "date");
                
                serializer.endTag(null, "sms");
            }
            serializer.endTag(null, "smss");
            
            //結束xml結尾
            serializer.endDocument();
            //關閉流
            fos.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 


  那么這里就生成如下圖的xml文件:





  3、讀取xml文件中的數據

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        try {
            //顯示數據信息
            TextView tv_sms = (TextView) findViewById(R.id.tv_weather);
            //通過上下文 獲取資產的管理者
            InputStream in = getAssets().open("smss.xml");
            //調用我們定義  解析xml的業務方法
            List<Sms> smsLists = SmsParser.xmlParser(in);
            
            StringBuffer sb = new StringBuffer();
            for (Sms sms : smsLists) {
                sb.append(sms.toString());
            }
            
            //把數據顯示到TextView上
            tv_sms.setText(sb.toString());
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

 
  部分代碼說明:

    這里我想教大家自己怎么去看開發文檔……所以大家自己去看開發文檔吧……哈哈哈~~
    ps:這里我想說明一下,不是我不會,也不是偷懶,而是大家在以后企業開發的時候都是可以查看開發文檔的,而且說實話Android中的東西真的很多很多,要全部記住那簡直太難啦……
    所以希望大家都能夠自己學會查看開發文檔……這也算是自己必修的一門課吧~~因為對於小白的我,學會了看文檔就免得很多很多的麻煩,比如突然有一個東東不會……怎么辦?哈哈哈……



三、總結 
 
   
   1、生成.txt文件的4種方法和步驟

  2、生成xml文件的2種方法和步驟

  3、讀取.txt文件

  4、讀取xml文件

  5、將數據存放在本機和SD卡中

  6、學會看開發文檔

  7、文件權限
 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM