Android数据存储之SharePreference和内部存储

Android中的数据存储

*存储方式
1.SharedPreference存储:简单的信息...
2.内部存储:保存在app内部存储空间,非公开
3.外部存储:公共空间
4.数据库存储:结构化数据
5.网络存储:云....

1.SharedPreference的用法

案列效果:点击保存数据会将数据保存data1文件中并显示保存成功且情况编辑框中内容,点击恢复数据则将之前填写的数据恢复到编辑框中

布局文件中:

 <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="姓名:" />

<EditText
    android:id="@+id/et_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:drawable/editbox_background"
    android:hint="请输入姓名" 
    android:textSize="20sp"
    />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:text="年龄:" />

<EditText
    android:id="@+id/et_age"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:drawable/editbox_background"
    android:hint="请输入年龄" 
    android:textSize="20sp"
    />
<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:orientation="horizontal">
    
    <Button 
        android:id="@+id/btn_save"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#FA8072"
        android:text="保存数据"/>
    
     <Button 
        android:id="@+id/btn_resume"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#FA8072"
        android:layout_marginLeft="5dp"
        android:text="恢复数据"/>
</LinearLayout>

java代码中;

public class MainActivity extends Activity implements OnClickListener{
	private EditText et_name,et_age;
	private Button btn_save,btn_resume;
	private SharedPreferences sp;//使用键值对的方式存储数据,相当于纸
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		btn_save.setOnClickListener(this);
		btn_resume.setOnClickListener(this);
		sp = getSharedPreferences("data1", MODE_PRIVATE);//第一个参数是保存的文件名,第二个是操作模式
	}

	private void initView() {
		et_name = (EditText) findViewById(R.id.et_name);
		et_age = (EditText) findViewById(R.id.et_age);
		btn_save = (Button) findViewById(R.id.btn_save);
		btn_resume = (Button) findViewById(R.id.btn_resume);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_save:
			String name = et_name.getText().toString().trim();//获取填写的内容并去掉空格
			String age = et_age.getText().toString().trim();
			if(TextUtils.isEmpty(name)||TextUtils.isEmpty(age)){
				return;    //若填写的内容有一个为空则退出,TextUtils.isEmpty()方法可以一次性进行两种空值的判断,当传入的字符串等于null或者等于空字符串时,该方法都返回true
			}
			Editor edit = sp.edit();//获得编辑器--->笔
			edit.putString("name",name);
			edit.putString("age", age);
			boolean commit = edit.commit();//提交--->保存
			if(commit){
				Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
				et_name.setText("");
				et_age.setText("");
			}
			break;
		case R.id.btn_resume:
			String nameValue = sp.getString("name", "");
			String ageValue = sp.getString("age", "");
			et_name.setText(nameValue);
			et_name.setSelection(nameValue.length());//setSelection方法将光标移动到文本末尾以便继续输入
			et_age.setText(ageValue);
			et_age.setSelection(ageValue.length());
			break;
		}	
	}
}

*2.内部存储的用法
主要方法:openFileOutput(文件名,操作模式):返回一个FileOutputStream对象
openFileInput(文件名):返回一个FileInputStream对象
deleteFile(文件名):删除文件
文件保存位置:/data/data/包名/files/...
内部存储特点:内部存储的东西会随着app的卸载而被清掉

案列效果:实现保存,打开,删除文件功能

xml布局:

 <LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    
    <EditText 
        android:id="@+id/et_filename"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@android:drawable/editbox_background"
        android:padding="10dp"
        android:hint="请输入文件名"
        android:textSize="20sp"
        android:singleLine="true"/>
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:drawable/editbox_background_normal"
        android:onClick="savefile"
        android:text="保存"/>
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:drawable/editbox_background_normal"
        android:onClick="openfile"
        android:text="打开"/>
</LinearLayout>

<EditText 
    android:id="@+id/et_content"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:hint="请输入内容"
    android:textSize="20sp"
    android:background="@android:drawable/editbox_background"
    />
<Button 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="delfile"
    android:text="删除文件"
    android:background="@android:drawable/editbox_background"/>

Java代码中:

public class MainActivity extends Activity {
	private EditText et_filename,et_content;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
	}

	private void initView() {
		et_filename = (EditText) findViewById(R.id.et_filename);
		et_content = (EditText) findViewById(R.id.et_content);
		
	}
	//保存文件
	public void savefile(View v){
		String filename = et_filename.getText().toString().trim();
		String content = et_content.getText().toString().trim();
		if(TextUtils.isEmpty(filename)||TextUtils.isEmpty(content)){
			return;
		}
		FileOutputStream out=null;
		BufferedWriter bw=null;
		try {
			out = openFileOutput(filename,MODE_PRIVATE);
			bw = new BufferedWriter(new OutputStreamWriter(out));
			bw.write(content);
			et_filename.setText("");
			et_content.setText("");
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(bw!=null){
					bw.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
		
	}
	//打开文件
	public void openfile(View v){
		String filename = et_filename.getText().toString().trim();
		if(TextUtils.isEmpty(filename)){
			return;
		}
		FileInputStream in=null;
		BufferedReader br=null;
		StringBuilder content = new StringBuilder();
		try {
			in = openFileInput(filename);
			br = new BufferedReader(new InputStreamReader(in));
			String line = "";
			while((line = br.readLine())!=null ){
				content.append(line);
			}
			et_content.setText(content);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(br!=null){
					br.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}		
	}
	//删除文件
	public void delfile(View v){
		String filename = et_filename.getText().toString().trim();
		if(TextUtils.isEmpty(filename)){
			return;
		}
		boolean deleteFile = deleteFile(filename);
		if(deleteFile){
			Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
			et_filename.setText("");
			et_content.setText("");
		}		
	}
}

原文地址:https://www.cnblogs.com/SanguineBoy/p/9895182.html