Android學習筆記—android數據存儲與訪問

數據存儲與訪問

—————————————

一個在手機和sd卡上存儲文件的例子

1.a.文件名稱:lable

  b.一個text框

  c.文件內容:label

  d.一個text框

  e.保存:button

—————————–

/File/res/layout

package com.credream.file;

 

 

import com.credream.service.FileService;

 

 

import android.app.Activity;

 

import android.os.Bundle;

 

import android.view.View;

 

import android.view.View.OnClickListener;

 

import android.widget.Button;

 

import android.widget.EditText;

 

import android.widget.Toast;

 

import android.widget.SimpleAdapter.ViewBinder;

 

 

public class FileActivity extends Activity

{

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

 

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button button = (Button) this.findViewById(R.id.button);

 

button.setOnClickListener(new ButtonClickListener());

 

}

 

private final class ButtonClickListener implements View.OnClickListener

{

 

 

@Override

public void onClick(View v)

{

EditText 

 

filenameText = (EditText) findViewById(R.id.filename);

EditText 

 

contentText = (EditText) findViewById(R.id.filecontent);

 

String filename = filenameText.getText().toString();

String content = contentText.getText().toString();

 

FileService service = new FileService(getApplicationContext());

 

// 這裡也可以傳FileActivity,因為FileActivity類,也是繼承自

 

// Context

 

try

{

service.save(filename, content);

 

Toast.makeText(getApplicationContext(), R.string.success, 1)

.show();

 

} catch (Exception e)

{

Toast.makeText(getApplicationContext(), R.string.fail, 1)

.show

 

();

e.printStackTrace();

}

 

}

 

}

}

—————————————–

/File/src/com/credream/service/FileService.java

package com.credream.service;

 

import java.io.FileOutputStream;

 

import android.content.Context;

 

public class FileService

{

/**

 *保存文件

 * @param filename 文件名稱

 * @param content  文件內容

 */

private Context context;

public FileService(Context context)

{

this.context = context;

}

public void save(String filename, String content) throws Exception

{

 //IO j2ee

FileOutputStream outStream=context.openFileOutput

 

(filename,Context.MODE_PRIVATE);

//mode:以覆蓋形式和追加形式兩種

       //context.openFileOutput(filename,mode)

//Context.MODE_PRIVATE私有操作模式 創建出來的文件隻能被本應用訪問

 

;其他應用無法訪問該文件

//另外采用私有操作模式創建的文件,寫入文件中的內容覆蓋源文件的內容

outStream.write(content.getBytes());//content.getBytes()這個方法

 

調用系統的

//Returns a new byte array containing the characters of this 

 

string encoded using the system's default charset. 

        //默認是用utf-8

//The behavior when this string cannot be represented in the 

 

system's default charset is unspecified. In practice, when the default charset is 

 

UTF-8 (as it is on Android), all strings can be encoded. 

        //沒有默認編碼的時候,會用iso8859-1來編碼

}

}

—————————————————————-

openFileOutput()方法的第一參數用於指定文件名稱,不能包含路徑分隔符“/” ,如果文

 

件不存在,Android 會自動創建它。創建的文件保存在/data/data/<package name>/files目

 

錄,如: /data/data/cn.itcast.action/files/itcast.txt ,通過點擊Eclipse菜

 

單“Window”-“Show View”-“Other”,在對話窗口中展開android文件夾,選擇下面的

 

File Explorer視圖,然後在File Explorer視圖中展開/data/data/<package name>/files目

 

錄就可以看到該文件。

openFileOutput()方法的第二參數用於指定操作模式,有四種模式,分別為: 

 

Context.MODE_PRIVATE    =  0

Context.MODE_APPEND    =  32768

Context.MODE_WORLD_READABLE =  1

Context.MODE_WORLD_WRITEABLE =  2

Context.MODE_PRIVATE:為默認操作模式,代表該文件是私有數據,隻能被應用本身訪問,

 

在該模式下,寫入的內容會覆蓋原文件的內容,如果想把新寫入的內容追加到原文件中。可

 

以使用Context.MODE_APPEND

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

 

件。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有權

 

限讀寫該文件。

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

 

前文件可以被其他應用寫入。

如果希望文件被其他應用讀和寫,可以傳入: 

openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + 

 

Context.MODE_WORLD_WRITEABLE);

——————————————————————-

android有一套自己的安全模型,當應用程序(.apk)在安裝時系統就會分配給他一個userid,

 

當該應用要去訪問其他資源比如文件的時候,就需要userid匹配。默認情況下,任何應用創

 

建的文件,sharedpreferences,數據庫都應該是私有的(位於/data/data/<package 

 

name>/files),其他程序無法訪問。除非在創建時指定瞭Context.MODE_WORLD_READABLE或

 

者Context.MODE_WORLD_WRITEABLE ,隻有這樣其他程序才能正確訪問。

———————————————————————-

1.數據的讀取:

  用數據的輸入流

———————-

在FileService.java中添加讀取內容的方法

/**

 * 文件讀取內容

 * @param filename 文件名

 * @return

 * @throws Exception

 */

public String read(String filename) throws Exception{

FileInputStream inputStream=context.openFileInput(filename);

ByteArrayOutputStream  outputStream=new ByteArrayOutputStream();

//這個方法會在/data/data/<package name>/files目錄下查找這個文件

//如果找到瞭就返回一個輸入流

byte[] buffer=new byte[1024];

//inputStream.read(buffer);//讀滿這個數組後返回

//隻要數據沒有讀完,需要一直調用這個方法

//這個方法的返回值為-1的時候,是讀完瞭,不是-1的時候返回的是

//讀取的大小字節

int len=0;

 while ((len=inputStream.read(buffer))!=-1){

outputStream.write(buffer,0,len);

 //把讀取的數據放到內存中

 }

 byte[] data=outputStream.toByteArray();

 return new String(data);

}

 

—————————————————————

編寫測試類:readTest.java

package com.credream.file;

 

import com.credream.service.FileService;

 

import android.test.AndroidTestCase;

import android.util.Log;

 

public class readTest extends AndroidTestCase

{

private static final String TAG="FileServiceTest";

public void testRead()throws Exception{

FileService service=new FileService(this.getContext());

String result=service.read("lidewei.txt");

Log.i(TAG, result);

}

}

————————————————————-

AndroidManifest.xml

清單文件中添加測試junit支持包

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="https://schemas.android.com/apk/res/android"

    package="com.credream.file"

    android:versionCode="1"

    android:versionName="1.0" >

 

    <uses-sdk android:minSdkVersion="8" />

 

    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name" >

        <activity

            android:label="@string/app_name"

            android:name=".FileActivity" >

            <intent-filter >

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

     <uses-library android:name="android.test.runner" />

        </application>

         <instrumentation

        android:name="android.test.InstrumentationTestRunner"

        android:targetPackage="com.credream.file" />

</manifest>

—————————————————————

右鍵測試,並用過濾器查看:03-05 00:31:17.771: I/FileServiceTest(7453): 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *