Android軟件開(kāi)發(fā)之?dāng)?shù)據(jù)的新建 儲(chǔ)存 讀取 刪除
1.使用SharedPreferences處理數(shù)據(jù)的 新建 儲(chǔ)存 讀取 刪除
SharedPreferences保存后生成的是XML文件,內(nèi)容是以節(jié)點(diǎn)的形勢(shì)保存在文件中,SharedPreferences類(lèi)提供了非常豐富的處理數(shù)據(jù)的方法下面我向大家介紹一下如何使用SharedPreferences來(lái)處理數(shù)據(jù)。
輸入須要保存的內(nèi)容
輸入姓名:雨松MOMO
輸入號(hào)碼:15810463139
點(diǎn)擊保存成功
保存成功以后,數(shù)據(jù)被保存到了data路徑下 /當(dāng)前包名 (紅框內(nèi)的包名是我的程序包名) /shared_prefs/main.xml中 , 使用EditPlus 打開(kāi)保存的內(nèi)容,我們可以清晰的看到內(nèi)容是以一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)的形式存在XML中。
SharedPreferences類(lèi)中提供了非常方便方法去保存數(shù)據(jù)與讀取數(shù)據(jù)大家請(qǐng)看下面的代碼片段,一個(gè)程序中可以存在多個(gè)SharedPreferences保存的XML文件 ,代碼中只須要根據(jù)不同的XML名稱(chēng)就可以通過(guò)方法拿到相應(yīng)的對(duì)象,由于它的批量遍歷查找,當(dāng)然這樣的作法肯定沒(méi)有數(shù)據(jù)庫(kù)更方便快捷,所以在開(kāi)發(fā)中處理一些比較小的零碎的數(shù)據(jù)就可以保存在這里,比如說(shuō)記錄軟件中用戶(hù)設(shè)置的音量大小,用戶(hù)輸入的查找信息等等都可以存在SharedPreferences中。 - public class SPActivity extends Activity {
/**使用SharedPreferences 來(lái)儲(chǔ)存與讀取數(shù)據(jù)**/
SharedPreferences mShared = null;
/**程序中可以同時(shí)存在多個(gè)SharedPreferences數(shù)據(jù), 根據(jù)SharedPreferences的名稱(chēng)就可以拿到對(duì)象**/
public final static String SHARED_MAIN = "main";
/**SharedPreferences中儲(chǔ)存數(shù)據(jù)的Key名稱(chēng)**/
public final static String KEY_NAME = "name";
public final static String KEY_NUMBER = "number";
/**SharedPreferences中儲(chǔ)存數(shù)據(jù)的路徑**/
public final static String DATA_URL = "/data/data/";
public final static String SHARED_MAIN_XML = "main.xml";
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.sharedpreferences);
/**拿到名稱(chēng)是SHARED_MAIN 的SharedPreferences對(duì)象**/
mShared = getSharedPreferences(SHARED_MAIN, Context.MODE_PRIVATE);
/**拿到SharedPreferences中保存的數(shù)值 第二個(gè)參數(shù)為如果SharedPreferences中沒(méi)有保存就賦一個(gè)默認(rèn)值**/
String name = mShared.getString(KEY_NAME, "數(shù)據(jù)庫(kù)中沒(méi)有儲(chǔ)存姓名");
String number = mShared.getString(KEY_NUMBER, "數(shù)據(jù)庫(kù)中沒(méi)有儲(chǔ)存號(hào)碼");
final EditText editName = (EditText)findViewById(R.id.sp_et0);
final EditText editNumber = (EditText)findViewById(R.id.sp_et1);
editName.setHint("上次輸入的姓名為【 " +name+"】");
editNumber.setHint("上次輸入的號(hào)碼為【 " +number+"】");
Button button0 = (Button)findViewById(R.id.sp_button0);
/**監(jiān)聽(tīng)按鈕點(diǎn)擊后保存用戶(hù)輸入信息到SharedPreferences中**/
button0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/**拿到用戶(hù)輸入的信息**/
String name = editName.getText().toString();
String number = editNumber.getText().toString();
/**開(kāi)始保存入SharedPreferences**/
Editor editor = mShared.edit();
editor.putString(KEY_NAME, name);
editor.putString(KEY_NUMBER, number);
/**put完畢必需要commit()否則無(wú)法保存**/
editor.commit();
ShowDialog("保存SharedPreferences成功");
}
});
Button button1 = (Button)findViewById(R.id.sp_button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/**開(kāi)始清除SharedPreferences中保存的內(nèi)容**/
Editor editor = mShared.edit();
editor.remove(KEY_NAME);
editor.remove(KEY_NUMBER);
//editor.clear();
editor.commit();
ShowDialog("清除SharedPreferences數(shù)據(jù)成功");
}
});
Button button2 = (Button)findViewById(R.id.sp_button2);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/** 刪除SharedPreferences文件 **/
File file = new File(DATA_URL + getPackageName().toString()
+ "/shared_prefs", SHARED_MAIN_XML);
if (file.exists()) {
file.delete();
}
ShowDialog("刪除SharedPreferences文件成功");
}
});
super.onCreate(savedInstanceState);
}
public void ShowDialog(String string) {
AlertDialog.Builder builder = new AlertDialog.Builder(SPActivity.this);
builder.setIcon(R.drawable.icon);
builder.setTitle(string);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
finish();
}
});
builder.show();
}
}
復(fù)制代碼 - <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ImageView android:id="@+id/sp_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image"
android:layout_gravity="center"
/>
<EditText android:id="@+id/sp_et0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請(qǐng)輸入你的姓名">
</EditText>
<EditText android:id="@+id/sp_et1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請(qǐng)輸入你的號(hào)碼">
</EditText>
<Button android:id="@+id/sp_button0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存輸入內(nèi)容shared">
</Button>
<Button android:id="@+id/sp_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除shared保存內(nèi)容">
</Button>
<Button android:id="@+id/sp_button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="刪除shared文件">
</Button>
</LinearLayout>
復(fù)制代碼 2.在本地data文件下使用自己生成的文件處理數(shù)據(jù)的 新建 儲(chǔ)存 讀取 刪除
如果說(shuō)不想把內(nèi)容存在SharedPreferences中的話,我們可以自己寫(xiě)一個(gè)文件保存須要的數(shù)據(jù),在這里我將文件保存在系統(tǒng)中的工程路徑下。
輸入需要保存的內(nèi)容
保存完畢后紅框內(nèi)呈現(xiàn)之前保存的數(shù)據(jù)
保存文件以后,文件被保存在了當(dāng)前工程下 files 文件夾的路徑下,這里說(shuō)一下data文件夾 如果手機(jī)沒(méi)有root 權(quán)限 用戶(hù)是訪問(wèn)不到的,這種儲(chǔ)存方式有一個(gè)麻煩的地方就是文件中保存的數(shù)據(jù)須要程序員自己去處理 , 好比文件中保存了很多字符串?dāng)?shù)據(jù) 但是我們只須要其中的一部分?jǐn)?shù)據(jù),這樣就須要自己去寫(xiě)代碼去從文件中拿需要的數(shù)據(jù)。
- public class FileActivity extends Activity {
public final static String FILE_NAME = "a.txt";
/**File中儲(chǔ)存數(shù)據(jù)的路徑**/
public final static String DATA_URL = "/data/data/";
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.file);
/**讀取內(nèi)容**/
String content = loadFile();
if(content == null) {
content ="上次沒(méi)有輸入內(nèi)容請(qǐng)輸入";
}
String str = "上次輸入保存的內(nèi)容的姓名為【 " +content + "】";
final EditText editContent = ((EditText)findViewById(R.id.file_et0));
editContent.setHint(str);
Button button0 = (Button)findViewById(R.id.file_button0);
/**監(jiān)聽(tīng)按鈕點(diǎn)擊后保存用戶(hù)輸入信息到file中**/
button0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/**拿到用戶(hù)輸入的信息**/
String content = editContent.getText().toString();
/**開(kāi)始保存入file**/
saveFile(content);
ShowDialog("保存File文件成功");
}
});
Button button1 = (Button)findViewById(R.id.file_button1);
/**監(jiān)聽(tīng)按鈕點(diǎn)擊后清空f(shuō)ile中內(nèi)容**/
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
cleanFile();
ShowDialog("清空File文件成功");
}
});
Button button2 = (Button)findViewById(R.id.file_button2);
/**監(jiān)聽(tīng)按鈕點(diǎn)擊后刪除file文件**/
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
File file = new File(DATA_URL + getPackageName().toString()
+ "/files", FILE_NAME);
if (file.exists()) {
file.delete();
}
ShowDialog("刪除file文件成功");
}
});
super.onCreate(savedInstanceState);
}
/**
* 保存內(nèi)容
* @param str
*/
public void saveFile(String str) {
try {
FileOutputStream outStream = this.openFileOutput(FILE_NAME,
Context.MODE_WORLD_READABLE);
outStream.write(str.getBytes());
outStream.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
/**
* 因?yàn)閖ava刪除文件內(nèi)容只有一種實(shí)現(xiàn)方法,就是把整個(gè)文件重寫(xiě),只是把須要?jiǎng)h除的那一條記錄去除掉
*/
public void cleanFile() {
//如果只須要?jiǎng)h除文件中的一部分內(nèi)容則須要在這里對(duì)字符串做一些操作
String cleanStr = "";
try {
FileOutputStream outStream = this.openFileOutput(FILE_NAME,
Context.MODE_WORLD_READABLE);
outStream.write(cleanStr.getBytes());
outStream.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
public String loadFile() {
try {
FileInputStream inStream = this.openFileInput(FILE_NAME);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = -1;
while ((length = inStream.read(buffer)) != -1) {
stream.write(buffer, 0, length);
}
stream.close();
inStream.close();
return stream.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
}
return null;
}
public void ShowDialog(String str) {
AlertDialog.Builder builder = new AlertDialog.Builder(FileActivity.this);
builder.setIcon(R.drawable.icon);
builder.setTitle(str);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
finish();
}
});
builder.show();
}
}
復(fù)制代碼 - <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ImageView android:id="@+id/file_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/jay"
android:layout_gravity="center"
/>
<EditText android:id="@+id/file_et0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請(qǐng)輸入需要保存的內(nèi)容">
</EditText>
<Button android:id="@+id/file_button0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存入file">
</Button>
<Button android:id="@+id/file_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除file保存內(nèi)容">
</Button>
<Button android:id="@+id/file_button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="刪除file文件">
</Button>
</LinearLayout>
復(fù)制代碼 3.在本地程序res/raw中讀取數(shù)據(jù)操作
Android 下提供了專(zhuān)門(mén)讀取程序res/raw路徑下資源的方法,但是沒(méi)有提供寫(xiě)入raw內(nèi)容的方法,也就是說(shuō)只能讀不能寫(xiě),在做軟件的時(shí)候有時(shí)須要讀取大量的文字資源,由于這些資源文字在軟件中不會(huì)改變所以無(wú)需去對(duì)它的內(nèi)容重寫(xiě)修改,就可以使用raw來(lái)操作數(shù)據(jù)。
如圖所示:在列表中讀取.bin文件中的內(nèi)容分別顯示在listView中
如圖所示在raw路徑下存了一個(gè)文件date0.bin ,下面是bin文件中保存的內(nèi)容,程序中須要對(duì)這個(gè).bin文件的內(nèi)容進(jìn)行讀取并顯示在屏幕中。
下面給出代碼的實(shí)現(xiàn) - public class loadRawActivity extends ListActivity {
private class MyListAdapter extends BaseAdapter {
private int[] colors = new int[] { 0xff626569, 0xff4f5257 };
public MyListAdapter(Context context) {
mContext = context;
}
public int getCount() {
return inpormation.length;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv;
if (convertView == null) {
tv = (TextView) LayoutInflater.from(mContext).inflate(
android.R.layout.simple_list_item_1, parent, false);
} else {
tv = (TextView) convertView;
}
int colorPos = position % colors.length;
tv.setBackgroundColor(colors[colorPos]);
tv.setText(String.valueOf(position + 1) + ":"
+ inpormation[position]);
return tv;
}
private Context mContext;
}
String[] inpormation = null;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
readFile(R.raw.date0);
setListAdapter(new MyListAdapter(this));
listView = getListView();
int[] colors = { 0, 0xFF505259, 0 };
listView
.setDivider(new GradientDrawable(Orientation.RIGHT_LEFT, colors));
listView.setDividerHeight(10);
super.onCreate(savedInstanceState);
}
/**
* 從raw中讀取數(shù)據(jù)
* @param ID
*/
public void readFile(int ID) {
InputStream in = null;
String temp = "";
try {
in = this.getResources().openRawResource(ID);
byte[] buff = new byte[1024];// 緩存
int rd = 0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((rd = in.read(buff)) != -1) {
baos.write(buff, 0, rd);
temp = new String(baos.toByteArray(), "UTF-8");
}
baos.close();
in.close();
inpormation = temp.split("
- ");
} catch (Exception e) {
Toast.makeText(this, "文件沒(méi)有找到", 2000).show();
}
}
}
復(fù)制代碼 3.在SD卡中處理新建 寫(xiě)入 讀取 刪除 的操作
可以把數(shù)據(jù)保存在SD卡中,在SD卡中建立一個(gè)文件去保存數(shù)據(jù),這里說(shuō)一下 ,SD卡 用戶(hù)是可以訪問(wèn)的,也就是說(shuō)可以把一些可有可無(wú)的數(shù)據(jù)存在SD卡中,即使用戶(hù)刪除了卡中的內(nèi)容也不會(huì)影像軟件的使用。
將文件在SD卡中刪除
- public class loadSDActivity extends Activity {
public final static String FILE_NAME = "b.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.sdfile);
/**讀取內(nèi)容**/
String content = loadFile();
if(content == null) {
content ="上次沒(méi)有輸入內(nèi)容請(qǐng)輸入";
}
final EditText editContent = (EditText)findViewById(R.id.sdfile_et0);
editContent.setHint("上次輸入SD卡的內(nèi)容的為【 " +content + "】");
Button button0 = (Button)findViewById(R.id.sdfile_button0);
/**監(jiān)聽(tīng)按鈕點(diǎn)擊后保存用戶(hù)輸入信息到SD卡中**/
button0.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
/**拿到用戶(hù)輸入的信息**/
String content = editContent.getText().toString();
/**開(kāi)始保存入SD卡**/
saveFile(content);
ShowDialog("保存SD卡文件成功");
}
});
Button button1 = (Button)findViewById(R.id.sdfile_button1);
/**去清除SD卡保存的內(nèi)容**/
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
cleanFile();
ShowDialog("清除SD卡文件中的內(nèi)容成功");
}
});
Button button2 = (Button)findViewById(R.id.sdfile_button2);
/**刪除SD卡保存的文件**/
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
DeleteSDFile();
}
});
super.onCreate(savedInstanceState);
}
/**
* 保存入SD卡中
* @param str
*/
public void saveFile(String str) {
FileOutputStream fileOutputStream = null;
File file = new File(Environment.getExternalStorageDirectory(),
FILE_NAME);
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(str.getBytes());
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 讀取SD卡的內(nèi)容
* @return
*/
public String loadFile() {
String path = Environment.getExternalStorageDirectory() +"/" + FILE_NAME;
try {
FileInputStream fi = new FileInputStream(path);
BufferedReader br = new BufferedReader(new InputStreamReader(
fi));
String readString = new String();
while ((readString = br.readLine()) != null) {
//數(shù)據(jù)多的話須要在這里處理 readString
return readString;
}
fi.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 刪除SD卡
*/
public void DeleteSDFile() {
String path = Environment.getExternalStorageDirectory() + "/"
+ FILE_NAME;
File file1 = new File(path);
boolean isdelte = file1.delete();
if(isdelte) {
ShowDialog("刪除SD卡成功");
}else {
finish();
}
}
/**
* 因?yàn)閖ava刪除文件內(nèi)容只有一種實(shí)現(xiàn)方法,就是把整個(gè)文件重寫(xiě),只是把須要?jiǎng)h除的那一條記錄去除掉
*/
public void cleanFile() {
//如果只須要?jiǎng)h除文件中的一部分內(nèi)容則須要在這里對(duì)字符串做一些操作
String cleanStr = "";
FileOutputStream fileOutputStream = null;
File file = new File(Environment.getExternalStorageDirectory(),
FILE_NAME);
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(cleanStr.getBytes());
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
public void ShowDialog(String str) {
AlertDialog.Builder builder = new AlertDialog.Builder(loadSDActivity.this);
builder.setIcon(R.drawable.icon);
builder.setTitle(str);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
finish();
}
});
builder.show();
}
}
復(fù)制代碼 - <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ImageView android:id="@+id/sdfile_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/g"
android:layout_gravity="center"
/>
<EditText android:id="@+id/sdfile_et0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="請(qǐng)輸入需要保存到SD卡的內(nèi)容">
</EditText>
<Button android:id="@+id/sdfile_button0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="保存輸入內(nèi)容到SD卡">
</Button>
<Button android:id="@+id/sdfile_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除SD卡保存文件的內(nèi)容">
</Button>
<Button android:id="@+id/sdfile_button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="刪除SD卡中保存的文件">
</Button>
</LinearLayout>
復(fù)制代碼 最后如果你還是覺(jué)得我寫(xiě)的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來(lái)
第七講數(shù)據(jù)的儲(chǔ)存與讀取.rar(312.88 KB, 下載次數(shù): 709)[/I]2011-9-2 23:51 上傳點(diǎn)擊文件名 下載積分: 下載豆 -2 |