最近学习了安卓数据库编程,一直没时间好好总结一下,因此今天抽空总结一下,算是给自己的知识升华一下。

首先,安卓数据存储分为五大类:
**1. Shared Preferences
- 外部存储(SD卡)
- 内部存储(手机内存)
- 网络存储
- SQLite Databases**

本篇博客先介绍手机内部和外部存储: 内部存储和外部也可以理解为File存储,谷歌为我们提供了两钟文件夹来存放File信息:
  
- files文件夹:存放重要文件,只有应用被卸载或者删除数据才会丢失
- cache文件夹:存放临时文件信息,应用删除缓存就删除文件数据
 这两种文件夹都位于数据文件夹下    

getFilesDir()//返回使用openFileOutput创建的文件的绝对路径

File file=getFilesDir();file.getPath();//返回/data/data/com.example.filestorage/files

File file=getCacheDir()
file.getPath();//返回data/data/com.example.filestorage/cache

## 内部存储 ##
在安卓中,Context给我们提供了两个方法来打开本应用程序文件夹下的文件的IO流。
File存储的文件位于应用文件夹/data/data/files

1 public abstract FileInputStream openFileInput(String name)//取得文件输入流
name:需要打开的文件,不能含有分隔符


2 public abstract FileOutputStream openFileOutput(String name, int mode)//取得文件输出流
name:需要打开的文件,不能含有分隔符
mode:打开文件的模式,安卓里面有四中文件创建模式:
       MODE_APPEND//追加模式,可以向文件追加内容
       MODE_PRIVATE//默认模式,私有模式,该文件只能被当前应用读写,并且输入新内容后就得内容会被删除
       MODE_WORLD_READABLE//只读模式,该应用程序可以被其他应用程序读取
       MODE_WORLD_WRITEABLE//可写模式,该应用程序可以被其他应用程序读写
   **注意:只有MODE_APPEND模式才可以追加内容,其它模式在写入新内容时,就得内容就被删除。**

**MODE_WORLD_READABLE和 MODE_WORLD_WRITEABLE已经被不建议使用,如果需要和其他的应用程序分享数据,建议使用Contenprovider或者Broadcastreceiver。

外部存储

进行外部存储读取数据的步骤:

1 配置权限
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2 判断SD卡状态,即是否插入SD卡
 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)  
  如果返回true,则SD卡可用,false不可用
3 取得SD卡目录
    Environment.getExternalStorageDirectory()
4 使用输出输入流读取SD卡文件数据
**内部存储示例代码*
```public class MainActivity extends ActionBarActivity {

    private EditText et_write,et_query;
    private static final String FILE_NAME="file1.txt";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

    }

    private void initView(){
        et_write=(EditText)findViewById(R.id.et_write);
        et_query=(EditText)findViewById(R.id.et_query);
    }

public void click1(View view) throws Exception{
  FileOutputStream fos=openFileOutput(FILE_NAME, MODE_APPEND);
  String datas=et_write.getText().toString().trim();
  fos.write(datas.getBytes());
  Toast.makeText(MainActivity.this, "添加成功", 0).show();
  fos.close();
}
  public void click2(View view) throws Exception{
     FileInputStream fis= openFileInput(FILE_NAME);
     byte[] buff=new byte[1024];
    //由于会修改和删除文件信息,所以为了减少内存开销,不建议使用不可改变字符串的String
     StringBuilder sb=new StringBuilder();
     int len=0;
     while((len=fis.read(buff))!=-1){
         sb.append(new String(buff));
     }

     et_query.setText(sb.toString());
     Toast.makeText(MainActivity.this, "读取成功", 0).show();

  }
片

`