安卓中的數據存取

引言:

在我們每天使用的手機設備中,無時無刻都在進行着數據的存和取。安卓作爲一種手機操作系統,提供瞭如下方式的數據存取方式:Preference,File,Sqlite和網絡,可以根據程序的實際需求選擇合適的存取方式。

1、Preference

使用Preference方式來存取數據,用到了SharedPreferences接口和SharedPreferences.Editor,這連個接口在android.content中。下面以一個例子說明這兩個接口的使用。我們經常會有這樣的經歷,正發短信了別人來了個電話,接了個電話,返回發信息窗口,前面編寫的內容還在,本實例就模擬實現這個功能。

界面很簡單,一個EditText,一個Button,詳細代碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editTextMsg"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine" />

    <Button
        android:id="@+id/buttonSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editTextMsg"
        android:layout_below="@+id/editTextMsg"
        android:text="發送" />

</RelativeLayout>

下面看看Activity的代碼:

package com.lzugis.preferenctest;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
	private EditText editTextMsg;
	private Button buttonSend;
	//定義臨時信息
	private static final String Temp_Sms="Temp_Sms";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		editTextMsg=(EditText)findViewById(R.id.editTextMsg);//實例化
		buttonSend=(Button)findViewById(R.id.buttonSend);
		
		SharedPreferences pre=getSharedPreferences(Temp_Sms,MODE_WORLD_READABLE);
		String content=pre.getString("sms_content", "");
		editTextMsg.setText(content);
		buttonSend.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent itent=new Intent();
                itent.setClass(MainActivity.this, RwActivity.class);
                startActivity(itent);//啓動另一個Activity
			}			
		});
	}

	@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;
	}

	protected void onStop(){
		super.onStop();
		SharedPreferences.Editor editor=getSharedPreferences(Temp_Sms,MODE_WORLD_READABLE).edit();
		editor.putString("sms_content",editTextMsg.getText().toString());
		editor.commit();
	};
}

說明:在OnStop方法中保存內容,使用getSharedPreferences().edit()方法獲得SharedPreferences.Editor接口,調用getSharedPreferences().edit()的putstring()方法保存短信內容,調用commit提交內容。實現後結果如下圖:

2、File 我們可以將一些數據直接以文件的形式保存在設備中,下面的例子分別舉例說明了對文件的讀取和從Sd卡中讀寫文件。Sd卡中操作,需要在AndroidManifest.xml文件中添加一下許可:

<!-- 在sd中創建和刪除文件的權限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 向SD卡中的寫入權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

界面設計的很簡單,一個EditText用來輸入內容,一個EditText用來讀取內容,兩個Button,分別響應對應的事件,代碼如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".RwActivity" >

    <EditText
        android:id="@+id/editTextWrite"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:inputType="textMultiLine" />

    <Button
        android:id="@+id/buttonWrite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editTextWrite"
        android:layout_below="@+id/editTextWrite"
        android:text="Write" />

    <EditText
        android:id="@+id/EditTextRead"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/buttonWrite"
        android:layout_below="@+id/buttonWrite"
        android:layout_marginTop="25dp"
        android:ems="10"
        android:inputType="textMultiLine" >
    </EditText>

    <Button
        android:id="@+id/ButtonRead"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/EditTextRead"
        android:layout_below="@+id/EditTextRead"
        android:text="Read" />

</RelativeLayout>

2.1 讀寫文件方法

寫文件方法:

        /*
	 * 寫文件方法
	 */
	private void write(String content)
	{
		try
		{
			FileOutputStream fos=openFileOutput(strFileName,MODE_APPEND);
			//寫內容
			fos.write(content.getBytes());
			//關閉文件流
			fos.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

讀文件方法:

	/*
	 * 讀文件方法
	 */
	private String read(){
		try
		{
			//實例化文件輸出流對象
			FileInputStream fis=openFileInput(strFileName);
			//定義緩存數組
			byte[] buffer=new byte[fis.available()];
			//讀到緩衝區
			fis.read(buffer);
			return new String(buffer);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return null;
	};

2.2 從Sd卡中讀寫文件

Sd卡寫文件方法:

	/* 
	 * 寫文件到Sd卡方法
	 */
	public void writeDataToSD(String strMsg)
	{
		try
		{
			// 獲取File對象,確定數據文件的信息
			File file  = new File(Environment.getExternalStorageDirectory(),"f.txt");
			//判斷sd的外部設置狀態是否可以讀寫
			if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
			{				
				//流的對象
				FileOutputStream fos = new FileOutputStream(file);
				//將字符串轉換成字節數組
				byte[] buffer = strMsg.getBytes();
				//開始寫入數據
				fos.write(buffer);
				//關閉流的使用
				fos.close();
				Toast.makeText(RwActivity.this, "文件"+strMsg+"寫入成功", 1000).show();
			}

		}
		catch(Exception ex)
		{
			Toast.makeText(RwActivity.this, "文件寫入失敗", 1000).show();
		}		
	}

SD卡讀文件方法:

	/*
	 * 從SD卡讀文件方法
	 */
	public void readDataFromSD()
	{
		try
		{			
			//創建File對象,確定需要讀取文件的信息
			File file = new File(Environment.getExternalStorageDirectory(),"f.txt");			
			//FileInputSteam 輸入流的對象
			FileInputStream fis = new FileInputStream(file);			
			//準備一個字節數組用戶裝即將讀取的數據
			byte[] buffer = new byte[fis.available()];			
			//開始進行文件的讀取
			fis.read(buffer);			
			//關閉流
			fis.close();			
			//將字節數組轉換成字符創, 並轉換編碼的格式
			String strMsg = EncodingUtils.getString(buffer, "UTF-8");
			edtRead.setText(strMsg);
			Toast.makeText(RwActivity.this, "文件讀取成功!", 1000).show();			
		}
		catch(Exception ex)
		{
			Toast.makeText(RwActivity.this, "文件讀取失敗!", 1000).show();
		}
	}

Oncreate()方法源碼:

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_rw);
		edtWrite=(EditText)findViewById(R.id.editTextWrite);
		edtRead=(EditText)findViewById(R.id.EditTextRead);
		btnWrite=(Button)findViewById(R.id.buttonWrite);
		btnRead=(Button)findViewById(R.id.ButtonRead);
		//寫內容
		btnWrite.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) 
			{	
//				write(edtWrite.getText().toString());
//				Toast.makeText(RwActivity.this, "文件寫入成功", 1000).show();
				writeDataToSD(edtWrite.getText().toString());
			}		 
		});
		//讀內容
		btnRead.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) 
			{	
//				edtRead.setText(read());
//				Toast.makeText(RwActivity.this, "文件讀取成功", 1000).show();
				readDataFromSD();		
			}		 
		});
	}

完成後,軟件的截圖如下:

關於Android中從Sqlite和網絡讀寫數據下面的博文中會陸續奉上,還望大家多多支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章