Android软件开发之数据的新建 储存 读取 删除

本文详细介绍Android应用中的数据存储方法,包括SharedPreferences配置文件的使用、本地文件读写操作、raw资源文件读取及SD卡文件管理。
Android软件开发之数据的新建 储存 读取 删除




雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6645629






1.使用SharedPreferences处理数据的 新建 储存 读取 删除


SharedPreferences保存后生成的是XML文件,内容是以节点的形势保存在文件中,SharedPreferences类提供了非常丰富的处理数据的方法下面我向大家介绍一下如何使用SharedPreferences来处理数据。


输入须要保存的内容




输入姓名:雨松MOMO
输入号码:15810463139





点击保存成功



保存成功以后,数据被保存到了data路径下 /当前包名 (红框内的包名是我的程序包名) /shared_prefs/main.xml中 , 使用EditPlus 打开保存的内容,我们可以清晰的看到内容是以一个节点一个节点的形式存在XML中。




SharedPreferences类中提供了非常方便方法去保存数据与读取数据大家请看下面的代码片段,一个程序中可以存在多个SharedPreferences保存的XML文件 ,代码中只须要根据不同的XML名称就可以通过方法拿到相应的对象,由于它的批量遍历查找,当然这样的作法肯定没有数据库更方便快捷,所以在开发中处理一些比较小的零碎的数据就可以保存在这里,比如说记录软件中用户设置的音量大小,用户输入的查找信息等等都可以存在SharedPreferences中。

  1. publicclassSPActivityextendsActivity{
  2. /**使用SharedPreferences来储存与读取数据**/
  3. SharedPreferencesmShared=null;
  4. /**程序中可以同时存在多个SharedPreferences数据,根据SharedPreferences的名称就可以拿到对象**/
  5. publicfinalstaticStringSHARED_MAIN="main";
  6. /**SharedPreferences中储存数据的Key名称**/
  7. publicfinalstaticStringKEY_NAME="name";
  8. publicfinalstaticStringKEY_NUMBER="number";
  9. /**SharedPreferences中储存数据的路径**/
  10. publicfinalstaticStringDATA_URL="/data/data/";
  11. publicfinalstaticStringSHARED_MAIN_XML="main.xml";
  12. @Override
  13. protectedvoidonCreate(BundlesavedInstanceState){
  14. setContentView(R.layout.sharedpreferences);
  15. /**拿到名称是SHARED_MAIN的SharedPreferences对象**/
  16. mShared=getSharedPreferences(SHARED_MAIN,Context.MODE_PRIVATE);
  17. /**拿到SharedPreferences中保存的数值第二个参数为如果SharedPreferences中没有保存就赋一个默认值**/
  18. Stringname=mShared.getString(KEY_NAME,"数据库中没有储存姓名");
  19. Stringnumber=mShared.getString(KEY_NUMBER,"数据库中没有储存号码");
  20. finalEditTexteditName=(EditText)findViewById(R.id.sp_et0);
  21. finalEditTexteditNumber=(EditText)findViewById(R.id.sp_et1);
  22. editName.setHint("上次输入的姓名为【"+name+"】");
  23. editNumber.setHint("上次输入的号码为【"+number+"】");
  24. Buttonbutton0=(Button)findViewById(R.id.sp_button0);
  25. /**监听按钮点击后保存用户输入信息到SharedPreferences中**/
  26. button0.setOnClickListener(newOnClickListener(){
  27. @Override
  28. publicvoidonClick(Viewarg0){
  29. /**拿到用户输入的信息**/
  30. Stringname=editName.getText().toString();
  31. Stringnumber=editNumber.getText().toString();
  32. /**开始保存入SharedPreferences**/
  33. Editoreditor=mShared.edit();
  34. editor.putString(KEY_NAME,name);
  35. editor.putString(KEY_NUMBER,number);
  36. /**put完毕必需要commit()否则无法保存**/
  37. editor.commit();
  38. ShowDialog("保存SharedPreferences成功");
  39. }
  40. });
  41. Buttonbutton1=(Button)findViewById(R.id.sp_button1);
  42. button1.setOnClickListener(newOnClickListener(){
  43. @Override
  44. publicvoidonClick(Viewarg0){
  45. /**开始清除SharedPreferences中保存的内容**/
  46. Editoreditor=mShared.edit();
  47. editor.remove(KEY_NAME);
  48. editor.remove(KEY_NUMBER);
  49. //editor.clear();
  50. editor.commit();
  51. ShowDialog("清除SharedPreferences数据成功");
  52. }
  53. });
  54. Buttonbutton2=(Button)findViewById(R.id.sp_button2);
  55. button2.setOnClickListener(newOnClickListener(){
  56. @Override
  57. publicvoidonClick(Viewarg0){
  58. /**删除SharedPreferences文件**/
  59. Filefile=newFile(DATA_URL+getPackageName().toString()
  60. +"/shared_prefs",SHARED_MAIN_XML);
  61. if(file.exists()){
  62. file.delete();
  63. }
  64. ShowDialog("删除SharedPreferences文件成功");
  65. }
  66. });
  67. super.onCreate(savedInstanceState);
  68. }
  69. publicvoidShowDialog(Stringstring){
  70. AlertDialog.Builderbuilder=newAlertDialog.Builder(SPActivity.this);
  71. builder.setIcon(R.drawable.icon);
  72. builder.setTitle(string);
  73. builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){
  74. publicvoidonClick(DialogInterfacedialog,intwhichButton){
  75. finish();
  76. }
  77. });
  78. builder.show();
  79. }
  80. }


  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical"
  6. >
  7. <ImageViewandroid:id="@+id/sp_image"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:src="@drawable/image"
  11. android:layout_gravity="center"
  12. />
  13. <EditTextandroid:id="@+id/sp_et0"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:hint="请输入你的姓名">
  17. </EditText>
  18. <EditTextandroid:id="@+id/sp_et1"
  19. android:layout_width="fill_parent"
  20. android:layout_height="wrap_content"
  21. android:hint="请输入你的号码">
  22. </EditText>
  23. <Buttonandroid:id="@+id/sp_button0"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="保存输入内容shared">
  27. </Button>
  28. <Buttonandroid:id="@+id/sp_button1"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:text="清除shared保存内容">
  32. </Button>
  33. <Buttonandroid:id="@+id/sp_button2"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:text="删除shared文件">
  37. </Button>
  38. </LinearLayout>


2.在本地data文件下使用自己生成的文件处理数据的 新建 储存 读取 删除


如果说不想把内容存在SharedPreferences中的话,我们可以自己写一个文件保存须要的数据,在这里我将文件保存在系统中的工程路径下。

输入需要保存的内容




保存完毕后红框内呈现之前保存的数据





保存文件以后,文件被保存在了当前工程下 files 文件夹的路径下,这里说一下data文件夹 如果手机没有root 权限 用户是访问不到的,这种储存方式有一个麻烦的地方就是文件中保存的数据须要程序员自己去处理 , 好比文件中保存了很多字符串数据 但是我们只须要其中的一部分数据,这样就须要自己去写代码去从文件中拿需要的数据。




  1. publicclassFileActivityextendsActivity{
  2. publicfinalstaticStringFILE_NAME="a.txt";
  3. /**File中储存数据的路径**/
  4. publicfinalstaticStringDATA_URL="/data/data/";
  5. @Override
  6. protectedvoidonCreate(BundlesavedInstanceState){
  7. setContentView(R.layout.file);
  8. /**读取内容**/
  9. Stringcontent=loadFile();
  10. if(content==null){
  11. content="上次没有输入内容请输入";
  12. }
  13. Stringstr="上次输入保存的内容的姓名为【"+content+"】";
  14. finalEditTexteditContent=((EditText)findViewById(R.id.file_et0));
  15. editContent.setHint(str);
  16. Buttonbutton0=(Button)findViewById(R.id.file_button0);
  17. /**监听按钮点击后保存用户输入信息到file中**/
  18. button0.setOnClickListener(newOnClickListener(){
  19. @Override
  20. publicvoidonClick(Viewarg0){
  21. /**拿到用户输入的信息**/
  22. Stringcontent=editContent.getText().toString();
  23. /**开始保存入file**/
  24. saveFile(content);
  25. ShowDialog("保存File文件成功");
  26. }
  27. });
  28. Buttonbutton1=(Button)findViewById(R.id.file_button1);
  29. /**监听按钮点击后清空file中内容**/
  30. button1.setOnClickListener(newOnClickListener(){
  31. @Override
  32. publicvoidonClick(Viewarg0){
  33. cleanFile();
  34. ShowDialog("清空File文件成功");
  35. }
  36. });
  37. Buttonbutton2=(Button)findViewById(R.id.file_button2);
  38. /**监听按钮点击后删除file文件**/
  39. button2.setOnClickListener(newOnClickListener(){
  40. @Override
  41. publicvoidonClick(Viewarg0){
  42. Filefile=newFile(DATA_URL+getPackageName().toString()
  43. +"/files",FILE_NAME);
  44. if(file.exists()){
  45. file.delete();
  46. }
  47. ShowDialog("删除file文件成功");
  48. }
  49. });
  50. super.onCreate(savedInstanceState);
  51. }
  52. /**
  53. *保存内容
  54. *@paramstr
  55. */
  56. publicvoidsaveFile(Stringstr){
  57. try{
  58. FileOutputStreamoutStream=this.openFileOutput(FILE_NAME,
  59. Context.MODE_WORLD_READABLE);
  60. outStream.write(str.getBytes());
  61. outStream.close();
  62. }catch(FileNotFoundExceptione){
  63. }catch(IOExceptione){
  64. }
  65. }
  66. /**
  67. *因为java删除文件内容只有一种实现方法,就是把整个文件重写,只是把须要删除的那一条记录去除掉
  68. */
  69. publicvoidcleanFile(){
  70. //如果只须要删除文件中的一部分内容则须要在这里对字符串做一些操作
  71. StringcleanStr="";
  72. try{
  73. FileOutputStreamoutStream=this.openFileOutput(FILE_NAME,
  74. Context.MODE_WORLD_READABLE);
  75. outStream.write(cleanStr.getBytes());
  76. outStream.close();
  77. }catch(FileNotFoundExceptione){
  78. }catch(IOExceptione){
  79. }
  80. }
  81. publicStringloadFile(){
  82. try{
  83. FileInputStreaminStream=this.openFileInput(FILE_NAME);
  84. ByteArrayOutputStreamstream=newByteArrayOutputStream();
  85. byte[]buffer=newbyte[1024];
  86. intlength=-1;
  87. while((length=inStream.read(buffer))!=-1){
  88. stream.write(buffer,0,length);
  89. }
  90. stream.close();
  91. inStream.close();
  92. returnstream.toString();
  93. }catch(FileNotFoundExceptione){
  94. e.printStackTrace();
  95. }catch(IOExceptione){
  96. }
  97. returnnull;
  98. }
  99. publicvoidShowDialog(Stringstr){
  100. AlertDialog.Builderbuilder=newAlertDialog.Builder(FileActivity.this);
  101. builder.setIcon(R.drawable.icon);
  102. builder.setTitle(str);
  103. builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){
  104. publicvoidonClick(DialogInterfacedialog,intwhichButton){
  105. finish();
  106. }
  107. });
  108. builder.show();
  109. }
  110. }

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical"
  6. >
  7. <ImageViewandroid:id="@+id/file_image"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:src="@drawable/jay"
  11. android:layout_gravity="center"
  12. />
  13. <EditTextandroid:id="@+id/file_et0"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:hint="请输入需要保存的内容">
  17. </EditText>
  18. <Buttonandroid:id="@+id/file_button0"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="保存入file">
  22. </Button>
  23. <Buttonandroid:id="@+id/file_button1"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="清除file保存内容">
  27. </Button>
  28. <Buttonandroid:id="@+id/file_button2"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:text="删除file文件">
  32. </Button>
  33. </LinearLayout>



3.在本地程序res/raw中读取数据操作

Android 下提供了专门读取程序res/raw路径下资源的方法,但是没有提供写入raw内容的方法,也就是说只能读不能写,在做软件的时候有时须要读取大量的文字资源,由于这些资源文字在软件中不会改变所以无需去对它的内容重写修改,就可以使用raw来操作数据。


如图所示:在列表中读取.bin文件中的内容分别显示在listView中




如图所示在raw路径下存了一个文件date0.bin ,下面是bin文件中保存的内容,程序中须要对这个.bin文件的内容进行读取并显示在屏幕中。




下面给出代码的实现

  1. publicclassloadRawActivityextendsListActivity{
  2. privateclassMyListAdapterextendsBaseAdapter{
  3. privateint[]colors=newint[]{0xff626569,0xff4f5257};
  4. publicMyListAdapter(Contextcontext){
  5. mContext=context;
  6. }
  7. publicintgetCount(){
  8. returninpormation.length;
  9. }
  10. @Override
  11. publicbooleanareAllItemsEnabled(){
  12. returnfalse;
  13. }
  14. publicObjectgetItem(intposition){
  15. returnposition;
  16. }
  17. publiclonggetItemId(intposition){
  18. returnposition;
  19. }
  20. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  21. TextViewtv;
  22. if(convertView==null){
  23. tv=(TextView)LayoutInflater.from(mContext).inflate(
  24. android.R.layout.simple_list_item_1,parent,false);
  25. }else{
  26. tv=(TextView)convertView;
  27. }
  28. intcolorPos=position%colors.length;
  29. tv.setBackgroundColor(colors[colorPos]);
  30. tv.setText(String.valueOf(position+1)+":"
  31. +inpormation[position]);
  32. returntv;
  33. }
  34. privateContextmContext;
  35. }
  36. String[]inpormation=null;
  37. ListViewlistView;
  38. @Override
  39. protectedvoidonCreate(BundlesavedInstanceState){
  40. readFile(R.raw.date0);
  41. setListAdapter(newMyListAdapter(this));
  42. listView=getListView();
  43. int[]colors={0,0xFF505259,0};
  44. listView
  45. .setDivider(newGradientDrawable(Orientation.RIGHT_LEFT,colors));
  46. listView.setDividerHeight(10);
  47. super.onCreate(savedInstanceState);
  48. }
  49. /**
  50. *从raw中读取数据
  51. *@paramID
  52. */
  53. publicvoidreadFile(intID){
  54. InputStreamin=null;
  55. Stringtemp="";
  56. try{
  57. in=this.getResources().openRawResource(ID);
  58. byte[]buff=newbyte[1024];//缓存
  59. intrd=0;
  60. ByteArrayOutputStreambaos=newByteArrayOutputStream();
  61. while((rd=in.read(buff))!=-1){
  62. baos.write(buff,0,rd);
  63. temp=newString(baos.toByteArray(),"UTF-8");
  64. }
  65. baos.close();
  66. in.close();
  67. inpormation=temp.split("\r\n");
  68. }catch(Exceptione){
  69. Toast.makeText(this,"文件没有找到",2000).show();
  70. }
  71. }
  72. }


3.在SD卡中处理新建 写入 读取 删除 的操作

可以把数据保存在SD卡中,在SD卡中建立一个文件去保存数据,这里说一下 ,SD卡 用户是可以访问的,也就是说可以把一些可有可无的数据存在SD卡中,即使用户删除了卡中的内容也不会影像软件的使用。






将文件在SD卡中删除





  1. publicclassloadSDActivityextendsActivity{
  2. publicfinalstaticStringFILE_NAME="b.txt";
  3. @Override
  4. protectedvoidonCreate(BundlesavedInstanceState){
  5. setContentView(R.layout.sdfile);
  6. /**读取内容**/
  7. Stringcontent=loadFile();
  8. if(content==null){
  9. content="上次没有输入内容请输入";
  10. }
  11. finalEditTexteditContent=(EditText)findViewById(R.id.sdfile_et0);
  12. editContent.setHint("上次输入SD卡的内容的为【"+content+"】");
  13. Buttonbutton0=(Button)findViewById(R.id.sdfile_button0);
  14. /**监听按钮点击后保存用户输入信息到SD卡中**/
  15. button0.setOnClickListener(newOnClickListener(){
  16. @Override
  17. publicvoidonClick(Viewarg0){
  18. /**拿到用户输入的信息**/
  19. Stringcontent=editContent.getText().toString();
  20. /**开始保存入SD卡**/
  21. saveFile(content);
  22. ShowDialog("保存SD卡文件成功");
  23. }
  24. });
  25. Buttonbutton1=(Button)findViewById(R.id.sdfile_button1);
  26. /**去清除SD卡保存的内容**/
  27. button1.setOnClickListener(newOnClickListener(){
  28. @Override
  29. publicvoidonClick(Viewarg0){
  30. cleanFile();
  31. ShowDialog("清除SD卡文件中的内容成功");
  32. }
  33. });
  34. Buttonbutton2=(Button)findViewById(R.id.sdfile_button2);
  35. /**删除SD卡保存的文件**/
  36. button2.setOnClickListener(newOnClickListener(){
  37. @Override
  38. publicvoidonClick(Viewarg0){
  39. DeleteSDFile();
  40. }
  41. });
  42. super.onCreate(savedInstanceState);
  43. }
  44. /**
  45. *保存入SD卡中
  46. *@paramstr
  47. */
  48. publicvoidsaveFile(Stringstr){
  49. FileOutputStreamfileOutputStream=null;
  50. Filefile=newFile(Environment.getExternalStorageDirectory(),
  51. FILE_NAME);
  52. try{
  53. fileOutputStream=newFileOutputStream(file);
  54. fileOutputStream.write(str.getBytes());
  55. fileOutputStream.close();
  56. }catch(FileNotFoundExceptione){
  57. e.printStackTrace();
  58. }catch(IOExceptione){
  59. e.printStackTrace();
  60. }
  61. }
  62. /**
  63. *读取SD卡的内容
  64. *@return
  65. */
  66. publicStringloadFile(){
  67. Stringpath=Environment.getExternalStorageDirectory()+"/"+FILE_NAME;
  68. try{
  69. FileInputStreamfi=newFileInputStream(path);
  70. BufferedReaderbr=newBufferedReader(newInputStreamReader(
  71. fi));
  72. StringreadString=newString();
  73. while((readString=br.readLine())!=null){
  74. //数据多的话须要在这里处理readString
  75. returnreadString;
  76. }
  77. fi.close();
  78. }catch(FileNotFoundExceptione){
  79. e.printStackTrace();
  80. }catch(IOExceptione){
  81. e.printStackTrace();
  82. }
  83. returnnull;
  84. }
  85. /**
  86. *删除SD卡
  87. */
  88. publicvoidDeleteSDFile(){
  89. Stringpath=Environment.getExternalStorageDirectory()+"/"
  90. +FILE_NAME;
  91. Filefile1=newFile(path);
  92. booleanisdelte=file1.delete();
  93. if(isdelte){
  94. ShowDialog("删除SD卡成功");
  95. }else{
  96. finish();
  97. }
  98. }
  99. /**
  100. *因为java删除文件内容只有一种实现方法,就是把整个文件重写,只是把须要删除的那一条记录去除掉
  101. */
  102. publicvoidcleanFile(){
  103. //如果只须要删除文件中的一部分内容则须要在这里对字符串做一些操作
  104. StringcleanStr="";
  105. FileOutputStreamfileOutputStream=null;
  106. Filefile=newFile(Environment.getExternalStorageDirectory(),
  107. FILE_NAME);
  108. try{
  109. fileOutputStream=newFileOutputStream(file);
  110. fileOutputStream.write(cleanStr.getBytes());
  111. fileOutputStream.close();
  112. }catch(FileNotFoundExceptione){
  113. e.printStackTrace();
  114. }catch(IOExceptione){
  115. e.printStackTrace();
  116. }
  117. }
  118. publicvoidShowDialog(Stringstr){
  119. AlertDialog.Builderbuilder=newAlertDialog.Builder(loadSDActivity.this);
  120. builder.setIcon(R.drawable.icon);
  121. builder.setTitle(str);
  122. builder.setPositiveButton("确定",newDialogInterface.OnClickListener(){
  123. publicvoidonClick(DialogInterfacedialog,intwhichButton){
  124. finish();
  125. }
  126. });
  127. builder.show();
  128. }
  129. }


  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical"
  6. >
  7. <ImageViewandroid:id="@+id/sdfile_image"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:src="@drawable/g"
  11. android:layout_gravity="center"
  12. />
  13. <EditTextandroid:id="@+id/sdfile_et0"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:hint="请输入需要保存到SD卡的内容">
  17. </EditText>
  18. <Buttonandroid:id="@+id/sdfile_button0"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="保存输入内容到SD卡">
  22. </Button>
  23. <Buttonandroid:id="@+id/sdfile_button1"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="清除SD卡保存文件的内容">
  27. </Button>
  28. <Buttonandroid:id="@+id/sdfile_button2"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:text="删除SD卡中保存的文件">
  32. </Button>
  33. </LinearLayout>


最近有朋友反映下载资源不够积分,无法下载很着急,从今天开始雨松MOMO更新的任何下载资源不会使用下载积分,欢迎大家下载阅读,还是那句老话每篇文章都会附带源代码的下载地址。

最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值