Android中的数据存储方式

第一种:
保存在应用程序私有的文件夹下---- 只有 应用程序自己可以访问
第二种:
保存到公共的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);
		}
    }
}   
	


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值