记账本小程序7天开发记录(第五天)

开发家庭记账本小程序必然会用到数据的存储,所以今天主要学习Android开发的数据存储。

##Android开发的数据存储

  • 文件存储
  1. 应用程序只可以把数据存储在自己私有的文件夹里, data/data/<包名>/文件名...
    1. 上下文:应用程序运行的环境
    2. api获取目标目录:
      • this.getFileDir()===>data/data/<包名>/files     //保存重要的配置信息
  • this.getCacheDir() ===>data/data/<包名>/cache   //缓存目录
    • package com.fmd.qqlander;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity { private static String MainActivity; private static final String TAG = MainActivity; private EditText et_qq; private EditText et_password; private CheckBox cb_remember; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_qq = findViewById(R.id.et_qq); et_password = findViewById(R.id.et_password); cb_remember = findViewById(R.id.cb_remember); //获取原来在文件中保存的QQ号码和密码,回到界面上。 //File file = new File("data/data/com.fmd.qqlander/info.txt"); //getFilesDir() === /data/data/<当前应用程序的包名>/files File file = new File(this.getFilesDir(),"info.txt"); if(file.exists()&&file.length()>0) { try { FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String info = br.readLine(); String qq = info.split("##")[0]; String pwd = info.split("##")[1]; et_qq.setText(qq); et_password.setText(pwd); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void login(View view) { String qq = et_qq.getText().toString().trim(); String pwd = et_password.getText().toString().trim(); if(TextUtils.isEmpty(qq)||TextUtils.isEmpty(pwd)){ Toast.makeText(this, "用户名或密码不能为空", 0).show(); return; } if(cb_remember.isChecked()) { //CheckBox被勾选时记住密码 Log.i(TAG,"记住密码"); }else { //不需要记住密码 Log.i(TAG,"不需要记住密码"); } try { //File file = new File("data/data/com.fmd.qqlander/info.txt"); File file = new File(this.getFilesDir(),"info.txt"); FileOutputStream fos = new FileOutputStream(file); fos.write((qq+"##"+pwd).getBytes()); fos.close(); Toast.makeText(this, "数据保存成功", 0).show(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Toast.makeText(this, "数据保存异常", 0).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }}

       

  • sd卡存储
  1. 应用程序可以把数据存储在外存储卡
    • 需要声明权限
    • Environment.getExternalStorageDirectory() //获取外部存储卡的目录
    • 需要注意检查sd卡是否可用,检查sd卡的剩余空间
File file = new File(Environment.getExternalStorageDirectory(),"info.txt"); if(file.exists()&&file.length()>0) { try { FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String info = br.readLine(); String qq = info.split("##")[0]; String pwd = info.split("##")[1]; et_qq.setText(qq); et_password.setText(pwd); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
  • 文件权限
  1. 应用程序在data/data/包名/目录下创建的文件都是私有的,其他应用程序是不可以访问的。
  2. 默认生成的文件都是私有的
  • 如何生成公开权限的文件
//生成公开权限的文件 public void getpublicFile(View view) { try { FileOutputStream fos = openFileOutput("public.txt",Context.MODE_WORLD_READABLE+Context.MODE_WORLD_READABLE); fos.write("private".getBytes()); fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
  • 更改文件权限的方法
  1. chmod:change mode       Linux下更改文件访问的权限
  • 参数 sharedperference
  1. 声明 sharedperference  //sp = this.getSharedPreferences("config", 0);
  2. 获取到一个参数
  3. 获取编辑器  //Editor editor = sp.edit();
  4. editor.putString(key,value);  //  editor.putInt();  //  editor.putDouble();
  5. editor.commit();保存数据完毕,必须记得调用commit的方法
  6. 获取数据 sp.getString(key,dafvalue);  //  sp.getInt();  //  sp.getDouble();
public class MainActivity extends Activity { private static String MainActivity; private static final String TAG = MainActivity; private EditText et_qq; private EditText et_password; private CheckBox cb_remember; //1.声明sp private SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_qq = findViewById(R.id.et_qq); et_password = findViewById(R.id.et_password); cb_remember = findViewById(R.id.cb_remember); //2.获取到一个参数 sp = this.getSharedPreferences("config", 0); String qq = sp.getString("qq", ""); String pwd = sp.getString("pwd", ""); et_qq.setText(qq); et_password.setText(pwd); } public void login(View view) { String qq = et_qq.getText().toString().trim(); String pwd = et_password.getText().toString().trim(); if(TextUtils.isEmpty(qq)||TextUtils.isEmpty(pwd)){ Toast.makeText(this, "用户名或密码不能为空", 0).show(); return; } if(cb_remember.isChecked()) { //CheckBox被勾选时记住密码 Log.i(TAG,"记住密码"); //3.得到sp文件的编辑器 Editor editor = sp.edit(); editor.putString("qq",qq); editor.putString("pwd",pwd); //4.保存数据完毕,必须记得调用commit的方法 editor.commit(); }else { //不需要记住密码 Log.i(TAG,"不需要记住密码"); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }

技术图片

相关文章