Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android之存儲數據的四大方式

android之存儲數據的四大方式

編輯:關於Android編程

下面詳細解釋這四大方式的特點

第一種:文件存儲數據

核心原理: Context提供了兩個方法來打開數據文件裡的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),這兩個方法第一個參數 用於指定文件名,第二個參數指定打開文件的模式。具體有以下值可選:

MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可 以使用Context.MODE_APPEND

MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件。

MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取;

MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入。

除此之外,Context還提供了如下幾個重要的方法:

getDir(String name , int mode):在應用程序的數據文件夾下獲取或者創建name對應的子目錄

File getFilesDir():獲取該應用程序的數據文件夾得絕對路徑

String[] fileList():返回該應用數據文件夾的全部文件

實例:

核心代碼:

布局:

 


    
    
    

activity中:

 

filename:

 

private String filename="info.txt";

 

保存:

public void mybtn1(View view) {
		// TODO Auto-generated method stub
		String Name=name.getText().toString();
		String Pwd=pwd.getText().toString();
		try {
			//字節文件輸出流是用於將數據寫入到File
			FileOutputStream fos=openFileOutput(filename, MODE_APPEND);
			PrintWriter out=new PrintWriter(fos);
			out.println(Name);
			out.println(Pwd);
			out.flush();
			try {
				fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			out.close();
			name.setText("");
			pwd.setText("");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
讀取:
public void mybtn2(View view) {
		// TODO Auto-generated method stub
		try {
			FileInputStream fis=openFileInput(filename);
			//字節轉換成字符流,再轉換為緩沖字符流
			BufferedReader br=new BufferedReader(new InputStreamReader(fis));
			String line=null;
			StringBuilder sb=new StringBuilder();
			try {
				while((line=br.readLine())!=null){
					sb.append(line+"\n");
					tv.setText(sb.toString());
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

效果圖: \  
第二種:SD卡存儲數據

其中讀寫步驟按如下進行:

1、調用Environment的getExternalStorageState()方法判斷手機上是否插了sd卡,且應用程序具有讀寫SD卡的權限,如下代碼將返回true

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

2、調用Environment.getExternalStorageDirectory()方法來獲取外部存儲器,也就是SD卡的目錄,或者使用"/mnt/sdcard/"目錄

3、使用IO流操作SD卡上的文件

注意點:手機應該已插入SD卡,對於模擬器而言,可通過mksdcard命令來創建虛擬存儲卡

必須在AndroidManifest.xml上配置讀寫SD卡的權限


實例: 核心代碼: 布局:用上面的布局   activity:   filename:
private String filename="my.txt";

保存:
public void mybtn1(View view) {
		// TODO Auto-generated method stub
		String Name=name.getText().toString();
		String Pwd=pwd.getText().toString();
		//1.判斷SD可用否
		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
			//2.獲取路徑
			String path=Environment.getExternalStorageDirectory().getAbsolutePath();
			//3.獲取流對象進行讀寫操作
			try {
				PrintWriter out=new PrintWriter(new FileOutputStream(path+"/"+filename));
				out.println(Name);
				out.println(Pwd);
				out.flush();
				name.setText("");
				pwd.setText("");
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			Toast.makeText(this, "SD卡不可用", 0).show();
		}
		
	}

讀取:
public void mybtn2(View view) {
		// TODO Auto-generated method stub
		if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
			//2.
			String path=Environment.getExternalStorageDirectory().getAbsolutePath();
			//3.
			try {
				BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(path+"/"+filename)));
				String line=null;
				StringBuilder sb=new StringBuilder();
				try {
					while((line=br.readLine())!=null){
						sb.append(line+"\n");
						tv.setText(sb.toString());
					}
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				name.setText("");
				pwd.setText("");
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		else{
			Toast.makeText(this, "SD卡不可用", 0).show();
		}
	}
效果圖: \   第三種:Shared Preferences存儲數據

適用范圍:保存少量的數據,且這些數據的格式非常簡單:字符串型、基本類型的值。比如應用程序的各種配置信息(如是否打開音效、是否使用震動效果、小游戲的玩家積分等),解鎖口 令密碼等

核心原理:保存基於XML文件存儲的key-value鍵值對數據,通常用來存儲一些簡單的配置信息。通過DDMS的File Explorer面板,展開文件浏覽樹,很明顯SharedPreferences數據總是存儲在/data/data//shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過SharedPreferences.edit()獲取的內部接口Editor對象實現。SharedPreferences本身是一 個接口,程序無法直接創建SharedPreferences實例,只能通過Context提供的getSharedPreferences(String name, int mode)方法來獲取SharedPreferences實例,該方法中name表示要操作的xml文件名,第二個參數具體如下:

Context.MODE_PRIVATE: 指定該SharedPreferences數據只能被本應用程序讀、寫。

Context.MODE_WORLD_READABLE:指定該SharedPreferences數據能被其他應用程序讀,但不能寫。

Context.MODE_WORLD_WRITEABLE:指定該SharedPreferences數據能被其他應用程序讀,寫

Editor有如下主要重要方法:

SharedPreferences.Editor clear():清空SharedPreferences裡所有數據

SharedPreferences.Editor putXxx(String key , xxx value):向SharedPreferences存入指定key對應的數據,其中xxx 可以是boolean,float,int等各種基本類型據

SharedPreferences.Editor remove():刪除SharedPreferences中指定key對應的數據項

boolean commit():當Editor編輯完成後,使用該方法提交修改

實例: 布局:用上面第一種的代碼 activity中: 保存:
public void mybtn1(View view){
		String Name=name.getText().toString();
		String Pwd=pwd.getText().toString();
		editor.putString("name", Name);
		editor.putString("pwd", Pwd);
		editor.putInt("count", 100);
		editor.putBoolean("sound", true);
		//提供修改之後的數據
		editor.commit();
		name.setText("");
		pwd.setText("");
	}

讀取:
 public void mybtn2(View view){
		String n=sp.getString("name", "");
		String p=sp.getString("pwd", "");
		int c=sp.getInt("count", 0);
		boolean b=sp.getBoolean("sound", false);
		tv.setText("姓名:"+n+"\n"+"密碼:"+p+"\n"+"次數:"+c+"\n"+"sound:"+b+"\n");
	}

效果圖:     第四種:SQLite存儲數據  

SQLite是輕量級嵌入式數據庫引擎,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。現在的主流移動設備像Android、iPhone等都使用SQLite作為復雜數據的存儲引擎,在我們為移動設備開發應用程序時,也許就要使用到SQLite來存儲我們大量的數據,所以我們就需要掌握移動設備上的SQLite開發技巧

SQLiteDatabase類為我們提供了很多種方法,上面的代碼中基本上囊括了大部分的數據庫操作,現在我寫了數據庫幫助類實現了數據庫的創建和更新

 

實例:

布局:

 


    
    
    

 

activity:

 

package com.example.fileapp;

import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class FourActivity extends Activity {

	private EditText nameEt,pwdEt;
	private ListView lv;
	private MyOpenHelper helper;
	//代表數據庫對象
	private SQLiteDatabase db;
	public void mybtn1(View view){
		String name=nameEt.getText().toString();
		String pwd=pwdEt.getText().toString();
		//try {
			insert(db,name,pwd);
		//} catch (Exception e) {
		//	create(db);
		//	insert(db,name,pwd);
		//}
	}
	private void create(SQLiteDatabase db) {
		String sql="create table s_user(_id integer primary key autoincrement,name text,pwd text)";
		db.execSQL(sql);
	}
	public void insert(SQLiteDatabase db,String name,String pwd){
		/*String sql="insert into s_user("+"name,pwd)values(?,?)";
		db.execSQL(sql,new String[]{name,pwd});*/
		
		//使用特定的方法:insert
		ContentValues values=new ContentValues();
		//key是字段名,value是插入的名字
		values.put("name", name);
		values.put("pwd", pwd);
		db.insert("s_user", null, values);
		
		nameEt.setText("");
		pwdEt.setText("");
	}
	
	public void mybtn2(View view){
		/*String sql="select * from s_user";
		Cursor cursor=db.rawQuery(sql, null);
			*/
		//使用特定的方法
		//
		Cursor cursor=db.query("s_user", null,null,null,null,null,null);		
		refresh(cursor);
	}
	private void refresh(Cursor cursor){
		SimpleCursorAdapter adapter=new SimpleCursorAdapter(
				this, 
				R.layout.activity_item,
				cursor, new String[]{"_id","name","pwd"},
				new int[]{R.id.id,R.id.name,R.id.pwd}, 
				SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);		
		lv.setAdapter(adapter);
	}
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_four);
		nameEt=(EditText)findViewById(R.id.name);
		pwdEt=(EditText)findViewById(R.id.pwd);
		lv=(ListView)findViewById(R.id.lv);
		lv.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				TextView tv=(TextView) view.findViewById(R.id.id);
				String pid=tv.getText().toString();
				/*String sql= "delete from s_user where _id="+pid;
				db.execSQL(sql);*/
				//使用特定方法
				db.delete("s_user", "_id=?", new String[]{pid});
				refresh(db.rawQuery("select *from s_user", null));
				return true;
			}
		});
		//第一種方式:獲取數據庫對象
			//第一個參數:數據庫文件的路徑
			//第二個參數:游標的工廠對象
		//db=SQLiteDatabase.openOrCreateDatabase(getFilesDir()+"/my.db", null);
		
		//第二種方式:獲取數據庫對象(方式更好)
		helper=new MyOpenHelper(this, "user.db", null, 1);
		db=helper.getReadableDatabase();
	}  
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		//關閉數據庫
		helper.close();
	}
}

 

幫助類MyOpenHelper:

 

package com.example.fileapp;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

//數據庫的幫助類:創建數據庫表和數據庫的更新
public class MyOpenHelper extends SQLiteOpenHelper{
	//定義該程序中每張表的建表語句
	private String sql1="create table s_user(_id integer primary key autoincrement,name,pwd)";

	//第二個參數是數據庫的名字,第三個是游標工廠對象,第四個是參數當前數據庫使用版本號
	public MyOpenHelper(Context context, String name, CursorFactory factory,
			int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
		
	}

	//用於創建數據庫表,第一次創建數據庫文件時被回調
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL(sql1);
	}

	//用於數據庫的更新,舊版本號和新版本號不一致會被回調
	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub
		
	}

}

 

效果圖:

\


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved