安卓---數據存儲

拓展知識:java

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面 顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。MVC被獨特的發展起來用於 映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。android

MVC開始是存在於桌面程序中的,M是指業務模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實現代碼分離,從而使同一個程序可使用不一樣的表現形式。好比一批統計數據能夠分別用柱狀圖餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。[1-2]   

模型-視圖-控制器(MVC)是Xerox PARC在二十世紀八十年代爲編程語言Smalltalk-80發明的一種軟件設計模式,已被普遍使用。後來被推薦爲Oracle旗下Sun公司Java EE平臺的設計模式,而且受到愈來愈多的使用ColdFusionPHP的開發者的歡迎。模型-視圖-控制器模式是一個有用的工具箱,它有不少好處,但也有一些缺點。git

MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計建立 Web 應用程序的模式:[1] 
  • Model(模型)表示應用程序核心(好比數據庫記錄列表)。
  • View(視圖)顯示數據(數據庫記錄)。
  • Controller(控制器)處理輸入(寫入數據庫記錄)。
MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的徹底控制。
Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。
  一般模型對象負責在數據庫中存取數據。
View(視圖)是應用程序中處理數據顯示的部分。
  一般視圖是依據模型數據建立的。
Controller(控制器)是應用程序中處理用戶交互的部分。
  一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
MVC 分層有助於管理複雜的應用程序,由於您能夠在一個時間內專門關注一個方面。例如,您能夠在不依賴業務邏輯的狀況下專一於視圖設計。同時也讓應用程序的測試更加容易。
MVC 分層同時也簡化了分組開發。不一樣的開發人員可同時開發視圖、控制器邏輯和業務邏輯。安卓中,也遵循MVC的設計模式。M-業務層,V-佈局,對應XML佈局,C-Activity。
1:從視圖中獲取數據  2:調用模型層處理,
在進行安卓文件存儲代碼實現時,須要涉及到io流的設計模式,測試業務層代碼,進行單元測試,目的是,在肯定業務方法沒有問題的狀況下,編寫控制層。
主要實現過程:
1:模型層的代碼實現:
  1 package com.example.fileoperatedemo.service;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.BufferedWriter;
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.FileNotFoundException;
  8 import java.io.FileOutputStream;
  9 import java.io.IOException;
 10 import java.io.InputStreamReader;
 11 import java.io.OutputStream;
 12 import java.io.OutputStreamWriter;
 13 
 14 import com.example.fileoperatedemo.MainActivity;
 15 
 16 import android.content.Context;
 17 import android.os.Environment;
 18 import android.view.View.OnClickListener;
 19 
 20 public class FileService
 21 {
 22     private Context context;
 23     private String fileName;
 24 
 25     public FileService(Context context2, String fileName)
 26     {
 27         this.context = (Context) context2;
 28         this.fileName = fileName;
 29     }
 30 
 31     public boolean save(String content)
 32     {
 33         BufferedWriter bw = null;
 34         boolean isSaveSucceed = false;
 35         try
 36         {
 37             /*
 38              * 此處須要用到io留設計模式。裝飾類。*
 39              * 1:構建文件輸出流通道:FileOutputStream,其中須要用到context的openFileOutput方法
 40              * 2:用OutputStream包裝FileOutputStream,裝換成字符輸出流,使用戶輸入中文時,不出現亂碼。
 41              * 3:使用BufferedWriter實現緩衝功能,包裝Writer。
 42              **/
 43             FileOutputStream fos = context.openFileOutput(fileName, context.MODE_PRIVATE);
 44             OutputStreamWriter writer = new OutputStreamWriter(fos);
 45             bw = new BufferedWriter(writer);//
 46             bw.write(content);
 47             isSaveSucceed = true;
 48 
 49         } catch (FileNotFoundException e)
 50         {
 51             e.printStackTrace();
 52         } catch (IOException e)
 53         {
 54             e.printStackTrace();
 55         } finally
 56         {//流佔用資源,最後必須進行關閉。
 57             if (bw != null)
 58                 try
 59                 {
 60                     bw.close();
 61                 } catch (IOException e)
 62                 {
 63                     e.printStackTrace();
 64                 }
 65         }
 66         return isSaveSucceed;
 67     }
 68 
 69     public String read()
 70     {
 71         String line;
 72         StringBuilder sb = new StringBuilder();
 73         BufferedReader br = null;
 74         try
 75         {
 76             FileInputStream fis = context.openFileInput(fileName);
 77             br = new BufferedReader(new InputStreamReader(fis));
 78             while ((line = br.readLine()) != null)//讀入文件的過程是一個循環的過程。
 79             {
 80                 sb.append(line);
 81             }
 82 
 83         } catch (FileNotFoundException e)
 84         {
 85             e.printStackTrace();
 86         } catch (IOException e)
 87         {
 88             e.printStackTrace();
 89         } finally
 90         {
 91             if (br != null)
 92             {
 93                 try
 94                 {
 95                     br.close();
 96                 } catch (IOException e)
 97                 {
 98                     // TODO Auto-generated catch block
 99                     e.printStackTrace();
100                 }
101             }
102         }
103         return sb.toString();
104     }
105 
106 }

在此處須要用到單元測試,是爲了後面在肯定業務層方法沒有問題的狀況下,而後就能夠進行對控制層的編寫。github

爲了進行單元測試,必須在ManiFest.xml下:數據庫

在</activity>後天要添加:<uses-library android:name="android.test.runner"/>編程

在</application>後添加:設計模式

1 <instrumentation
2         android:name="android.test.InstrumentationTestRunner"
3         android:targetPackage="com.example.fileoperatedemo" >
4     </instrumentation>

2:添加須要進行單元測試的測試類,並讓其繼承AndroidTestCase:app

 1 package com.example.fileoperatedemo.test;
 2 
 3 import com.example.fileoperatedemo.service.FileService;
 4 
 5 import android.test.AndroidTestCase;
 6 
 7 public class FileServieTest extends AndroidTestCase {
 8     public void testSave(){
 9         /*
10          * 普通類中沒有context方法。****/
11         FileService fileService=new FileService(getContext(), "test.txt");
12         fileService.save("hello world");
13     }
14 }

若是單元測試成功,將會顯示以下綠色的進程條。不成功將會顯示紅色的條。:編程語言

另外生成的text.txt在ddms-File Explorer下面的data-data-對應所在包下(在本例中就是com.example.fileoperatedemo)查看。也能夠將txt導入到本地查看。ide

2:MainActivity:(拓展:背景音樂的添加:在res下新建一個文件夾raw,裏面導入你須要的音樂。而後在調用的地方調用便可。直接在MainActivity中添加代碼:

 1 private MediaPlayer mMediaPlayer;
 2  
 3 private void playLocalFile() {
 4         mMediaPlayer = MediaPlayer.create(this, R.raw.in_call_alarm);
 5         //播放工程res目錄下的raw目錄中的音樂文件in_call_alarm
 6         try {
 7             mMediaPlayer.prepare();
 8         } catch (IllegalStateException e) {
 9             
10         } catch (IOException e) {
11            
12         }
13  
14         mMediaPlayer.start();
15         headsetplay.setEnabled(false);
16  
17         mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
18                 public void onCompletion(MediaPlayer mp) {
19                     //播完了接着播或者關閉mMediaPlayer
20             });
21     }
MainActivity.java以下:
package com.example.fileoperatedemo;

import android.media.MediaPlayer.OnCompletionListener;

import java.io.IOException;

import com.example.fileoperatedemo.service.FileService;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

//控制層
public class MainActivity extends Activity
{
//此處添加了背景音樂,在程序的運行過程當中播放。
private MediaPlayer mMediaPlayer; private EditText etContent; private Button button; private void playLocalFile() { mMediaPlayer = MediaPlayer.create(this,R.raw.shoulder); try { mMediaPlayer.prepare(); } catch (IllegalStateException e) { } catch (IOException e) { } mMediaPlayer.start(); mMediaPlayer.setOnCompletionListener(new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { }}); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); playLocalFile(); initViews(); button=(Button) findViewById(R.id.btnOk); //定義彈出框 AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setMessage(R.string.dialog_text).setCancelable(false).setTitle(R.string.dialog_title).setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog,int id){ dialog.dismiss(); } }); final AlertDialog alert=builder.create(); //綁定事件 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { alert.show(); } }); } private void initViews() { etContent = (EditText) findViewById(R.id.etContent); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void save(View view) { // 從V獲取數據 String content = etContent.getText().toString(); // 調用模型層M進行處理 FileService fileService = new FileService(this, "data.txt"); boolean isSavesucceed = fileService.save(content); if (isSavesucceed) { Toast.makeText(this, "恭喜你,保存成功了", Toast.LENGTH_LONG).show(); } } }

另外還加入了一個透明背景。在ManiFest中設置Activity Theme爲Theme,Translucents使Activity透明。

運行界面以下:

3:代碼下載請訪問:

相關文章
相關標籤/搜索