Android中的数据存储方式

来源:互联网 发布:c 手机软件编程 编辑:程序博客网 时间:2024/05/16 05:33
第一种:
保存在应用程序私有的文件夹下---- 只有 应用程序自己可以访问
第二种:
保存到公共的sd 卡上,  --------- 其他的应用程序也可以访问
第三种:
使用sharedPreference去保存----- 只有 应用 程序自己可以访问
第四种:
使用 xml 文件去保存
第五种:

使用数据库去保存

第一种:保存在应用程序的私有文件夹下

public class MainActivity extends Activity {EditText ed_number;EditText ed_pwd;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                ed_number = (EditText) findViewById(R.id.ed_number);        ed_pwd = (EditText) findViewById(R.id.ed_pwd);                        //回显,也就是自动显示        try {        File file = new File(getCacheDir(), "info.txt");BufferedReader br = new BufferedReader(new FileReader(file));String value = br.readLine();String number = value.split("#")[0];String pwd = value.split("#")[1];ed_number.setText(number);ed_pwd.setText(pwd);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}    }        public void login(View v) throws Exception {    String number = ed_number.getText().toString().trim();    String pwd = ed_pwd.getText().toString().trim();        if(TextUtils.isEmpty(number) || TextUtils.isEmpty(pwd)) {    Toast.makeText(this, "对不起,不能为空", 0).show();    }    /*第一步:得到应用程序的私有文件夹吗,共有三种方法*/    //第一种:得到应用程序私有文件的方法    File file1 = new File("/data/data/com.itheima.qqlogin/info.txt");        //第二种:保存存到应用程序的  /data/data/com.itheima.qqlogin/files文件夹里了    File file2 = new File(getFilesDir(),"info.txt");        //第三种:保存 到 应用程序的  /data/data/com.itheima.qqlogin/cache文件夹里了    File file3 = new File(getCacheDir(), "info.txt");        /*第二步:创建流文件*/    String value = number + "#" + pwd;    OutputStream out = new FileOutputStream(file3);        /*第三步:写入*/    out.write(value.getBytes());    out.close();        Toast.makeText(this, "保存成功", 0).show();        }}
第二种:保存在sdcard中
1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true
     Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录
3、使用IO流操作SD卡上的文件 

public class MainActivity extends Activity {EditText ed_number;EditText ed_pwd;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                ed_number = (EditText) findViewById(R.id.ed_number);        ed_pwd = (EditText) findViewById(R.id.ed_pwd);    }        public void login(View v) throws Exception {    String number = ed_number.getText().toString().trim();    String pwd = ed_pwd.getText().toString().trim();        if(TextUtils.isEmpty(number) || TextUtils.isEmpty(pwd)) {    Toast.makeText(this, "对不起,不能为空", 0).show();    }        /*第一步:判断sd 卡是否 可用, 如果 sd 卡不可用, 应该给用户提示 *///    if(!Environment.getExternalStorageState().equals("mounted")){    if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {    Toast.makeText(this, "对不起, sd 卡 不可用, 请检查sd 卡的状态   ", 0).show();//如果进来, 则需要给用户提示 sd 卡不可用 return;    }    /*第二步:还会检查 sd 卡的 可用 是否够。内存 */    long freeSpace = Environment.getExternalStorageDirectory().getFreeSpace();String size = Formatter.formatFileSize(this, freeSpace);Toast.makeText(this, "可用存储 空间 是 : " + size, 0).show();/*第三步:获得sd卡的位置并保存*/File file = new File(Environment.getExternalStorageDirectory(), "info.txt");String value = number+"#"+pwd;OutputStream out = new FileOutputStream(file);out.write(value.getBytes());out.close();    Toast.makeText(this, "保存成功", 0).show();        }    }
第三种:保存在sharedPreference
SharedPreference是一种轻型的数据存储方式,实际上是基于XML文件存储的“key-value”键值对数据。通常用来存储程序的一些配置信息。其存储在“data/data/程序名/shared_prefs目录下。SharedPreference本身只能获取数据,不支持存储和修改。存储和修改要通过Editor对象来实现。
1、根据Context的getSharedPrerences(key, [模式])方法获取SharedPreference对象;
2、利用SharedPreference的editor()方法获取Editor对象;
3、通过Editor的putXXX()方法,将键值对存储数据;
4、通过Editor的commit()或者apply()方法将数据提交到SharedPreference内。

public class MainActivity extends Activity {EditText ed_number;EditText ed_pwd;SharedPreferences sp;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                ed_number = (EditText) findViewById(R.id.ed_number);        ed_pwd = (EditText) findViewById(R.id.ed_pwd);                //将号码和密码回显        sp = getSharedPreferences("config", Context.MODE_PRIVATE);        String number = sp.getString("number", "");        String pwd = sp.getString("pwd", "");        ed_number.setText(number);        ed_pwd.setText(pwd);    }        public void login(View v) throws Exception {    String number = ed_number.getText().toString().trim();    String pwd = ed_pwd.getText().toString().trim();        if(TextUtils.isEmpty(number) || TextUtils.isEmpty(pwd)) {    Toast.makeText(this, "对不起,不能为空", 0).show();    }        /*第一步:获得共享文件中,保存在应用程序的私有文件夹下*/    //sp = getSharedPreferences("config", Context.MODE_PRIVATE);        /*第二步:获得共享文件的编辑器*/    Editor editor = sp.edit();    editor.putString("number", number);    editor.putString("pwd", pwd);        /*第三步:提交, 那么数据就会 由 内存中 写到 xml 文件中去了*/    //editor.commit();//线程不安全    editor.apply();//线程安全    Toast.makeText(this, "保存成功", 0).show();        }}
第四种:使用 xml 文件去保存
public class MainActivity extends Activity {private EditText ed_name;private EditText ed_number;private RadioGroup rgb;private TextView tv_info;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ed_name = (EditText) findViewById(R.id.ed_name);        ed_number = (EditText) findViewById(R.id.ed_number);        rgb = (RadioGroup) findViewById(R.id.rgb);        tv_info = (TextView) findViewById(R.id.tv_info);            }        //保存学生的信息    public void save(View v) {    String name = ed_name.getText().toString().trim();    String number = ed_number.getText().toString().trim();        if(TextUtils.isEmpty(name) || TextUtils.isEmpty(number)) {    Toast.makeText(this, "对不起, 学生姓名和 学号不能为空", 0).show();return;    }/*zs.xml小作业:  保存学生的信息的时候, 保存下学生的 城市 city 信息 <?xml version="1.0" standalone="yes" encoding="gbk"?><student city="shenzhen"><name>张三</name><number>20150832</number><sex>male</sex></student>lisi.xml<student city="guangzhou"><name>李四</name><number>20150832</number><sex>male</sex></student>pull解析 器的一套 api 包括 : serializer , 以及 pullparser android中 已经集成 了pull 解析器 所 有的 api , 所以这里 可以直接用了. *  */    String sex = "male";    int id = rgb.getCheckedRadioButtonId();        if(id == R.id.male) {    sex = "male";    }else {    sex = "female";    }        try {File file = new File(getFilesDir(), name + ".xml");//1.得到解析器XmlSerializer newSerializer = Xml.newSerializer();//2.创建流并写入xml解析器中OutputStream out = new FileOutputStream(file);newSerializer.setOutput(out, "utf-8");//3.开始解析//3.1设置xml头部newSerializer.startDocument("utf-8", true);//3.2 设置键newSerializer.startTag(null, "student");//3.3 设置值newSerializer.startTag(null, "name");newSerializer.text(name);newSerializer.endTag(null, "name");newSerializer.startTag(null, "number");newSerializer.text(number);newSerializer.endTag(null, "number");newSerializer.startTag(null, "sex");newSerializer.text(sex);newSerializer.endTag(null, "sex");newSerializer.endTag(null, "student");newSerializer.endDocument();} catch (Exception e) {// TODO: handle exception}    }    public void query(View v) {        String name = ed_name.getText().toString().trim();if(TextUtils.isEmpty(name)){Toast.makeText(this, "要查询的学生的姓名不能为空 ", 0).show();return;}File file = new File(getFilesDir(), name+".xml");if(file==null||file.length()<=0){Toast.makeText(this, "要查询的学生的姓名 不存在 ", 0).show();return;}//则说明 学生的信息 肯定存在//就需要去解析xml 文件了 try {XmlPullParser parser =  Xml.newPullParser();InputStream in = new FileInputStream(file);parser.setInput(in, "UTF-8");int type = parser.getEventType();/* * <student city="guangzhou"><name>李四</name><number>20150832</number><sex>male</sex></student> *  */String cityValue = null;String nameValue = null;String number = null;String sex = null;while(type!=XmlPullParser.END_DOCUMENT){if(XmlPullParser.START_TAG==type){if("student".equals(parser.getName())){int count = parser.getAttributeCount();if(count>0){cityValue = parser.getAttributeValue(0);}}else if("name".equals(parser.getName())){nameValue = parser.nextText();}else if("number".equals(parser.getName())){number = parser.nextText();}else if("sex".equals(parser.getName())){sex = parser.nextText();}}type=parser.next();}tv_info.setText(nameValue+"\n"+number +"\n"+sex+"\n"+cityValue);} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "解析失败  ", 0).show();}    }}
第五种:使用数据库去保存
QLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧,具体的可以上网查一下。
Android中集成了SQLite数据库,我们在使用的时候只需要继承SQLiteOpenHelper这个类即可。

package com.heima.studentsystem.db;public class StudentDbOpenHelper extends SQLiteOpenHelper {public StudentDbOpenHelper(Context context) {super(context, "student.db", null, 1);// TODO Auto-generated constructor stub}@Override// sqlite数据库 最终在 存储数据时, 实际上都是  字符串. public void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL("create table students (_id integer primary key autoincrement, name varchar(30), sex varchar(10))");}@Override//更新public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}}package com.heima.studentsystem.db.dao;public class StudentDao {StudentDbOpenHelper helper;public StudentDao(Context context) {helper = new StudentDbOpenHelper(context);}//如果做 增删改 操作, 那么 就 getWritableDatabase .,表示 获得一个 可写的数据库 public void insert(String name, String sex) {SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("insert into students values(null,?,?)", new Object[]{name,sex});db.close();}public void delete(String name){SQLiteDatabase db = helper.getWritableDatabase();//delete from student where name=?db.execSQL("delete from students where name=?",new Object[]{name});db.close();}public void update(String name, String sex){SQLiteDatabase db = helper.getWritableDatabase();// update students set sex=? where name=?;db.execSQL("update students set sex=? where name=?", new Object[]{sex,name});db.close();}public String findOne(String name){//获得一个可读的数据库 SQLiteDatabase db = helper.getReadableDatabase();//db.execSQL("select * from students where name=?", new Object[]{name});//执行 查询 语句 Cursor cursor = db.rawQuery("select sex from students where name=?",new String[]{name});String sex = null;if(cursor.moveToNext()){sex = cursor.getString(0);}return sex;}public List<Student> getAll() {SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from students", null);List<Student> list = new ArrayList<Student>();Student student = null;while(cursor.moveToNext()) {int id = cursor.getInt(0);String name = cursor.getString(1);String sex = cursor.getString(2);student = new Student(id, name, sex);list.add(student);}return list;}}package com.heima.studentsystem;public class MainActivity extends Activity {private EditText ed_name;private RadioGroup rgb;private LinearLayout ll_layout;StudentDao sdao;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ed_name = (EditText) findViewById(R.id.ed_name);        rgb = (RadioGroup) findViewById(R.id.rgb);        ll_layout = (LinearLayout) findViewById(R.id.ll_layout);                sdao = new StudentDao(this);    }        //保存学生的信息    public void save(View v) {    String name = ed_name.getText().toString().trim();        if(TextUtils.isEmpty(name)) {    Toast.makeText(this, "对不起, 学生姓名和 学号不能为空", 0).show();return;    }    String sex ="male";//拿到 被 选择的 radio 单选项 int id = rgb.getCheckedRadioButtonId();if(id==R.id.male){sex ="male";}else {sex="female";}//调用 dao 存学生的信息sdao.insert(name, sex);    Toast.makeText(this, "保存成功", 0).show();    }        public void display(View v) {    List<Student> list = sdao.getAll();        ll_layout.removeAllViews();        for (Student student : list) {TextView tv = new TextView(this);tv.setText(student.toString());ll_layout.addView(tv);}    }}   


原创粉丝点击