第一种:
保存在应用程序私有的文件夹下---- 只有 应用程序自己可以访问
第二种:
保存到公共的sd 卡上, --------- 其他的应用程序也可以访问
第三种:
使用sharedPreference去保存----- 只有 应用 程序自己可以访问
第四种:
使用 xml 文件去保存
第五种:
1、调用Environment的getExternalStorageState()方法判断手机上是否插了sd卡,且应用程序具有读写SD卡的权限,如下代码将返回true
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
2、调用Environment.getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的目录,或者使用"/mnt/sdcard/"目录
3、使用IO流操作SD卡上的文件
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内。
QLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧,具体的可以上网查一下。
Android中集成了SQLite数据库,我们在使用的时候只需要继承SQLiteOpenHelper这个类即可。
保存在应用程序私有的文件夹下---- 只有 应用程序自己可以访问
第二种:
保存到公共的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 block
e.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 stub
db.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);
}
}
}