Android学习三 数据存储相关

一、存储到sd卡

      将数据存储到sd卡的步骤:

1、判断sd卡是否正常

2、判断存储空间是否足够

3、保存数据

      3.1 封装要保存的数据

      3.2 获取sd卡目录

      3.3 创建保存数据的文件

      3.4 创建文件写入流

      3.5 将数据写入文件

一个保存登陆账号和密码的小案例如下:

				//判断Sdcard状态是否正常
				if(!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)){
					//sdcard状态是没有挂载的情况
					Toast.makeText(mContext, "sdcard不存在或未挂载", Toast.LENGTH_SHORT).show();
					return ;
				}
				
				
				//判断sdcard存储空间是否满足文件的存储
				File sdcard_filedir = Environment.getExternalStorageDirectory();//得到sdcard的目录作为一个文件对象
				long usableSpace = sdcard_filedir.getUsableSpace();//获取文件目录对象剩余空间
				long totalSpace = sdcard_filedir.getTotalSpace();
				//将一个long类型的文件大小格式化成用户可以看懂的M,G字符串
				String usableSpace_str = Formatter.formatFileSize(mContext, usableSpace);
				String totalSpace_str = Formatter.formatFileSize(mContext, totalSpace);
				if(usableSpace < 1024 * 1024 * 200){//判断剩余空间是否小于200M
					Toast.makeText(mContext, "sdcard剩余空间不足,无法满足下载;剩余空间为:"+usableSpace_str, Toast.LENGTH_SHORT).show();
					return ;	
				}
				//保存数据
				boolean result = UserInfoUtil.saveUserInfo(mContext,username,password);
				if(result){
					Toast.makeText(mContext, "用户名密码保存成功", Toast.LENGTH_SHORT).show();
				}else{
					Toast.makeText(mContext, "用户名密码保存失败", Toast.LENGTH_SHORT).show();	
				}

saveUserInfo代码:

			String userinfo = username + "##"+ password;//封装用户名密码
			//通过Environment获取sdcard的目录
			String path = Environment.getExternalStorageDirectory().getPath();
			File file = new File(path,"userinfo.txt");//创建file
			FileOutputStream fileOutputStream = new FileOutputStream(file);//创建文件写入流
			fileOutputStream.write(userinfo.getBytes());//将用户名密码写入文件
			fileOutputStream.close();
存储到sd卡 要注意需要设置外部存储的权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>。

获取存储目录:

context.getFileDir().getPath();  获取到/data/data目录,是一个应用程序的私有目录,只有当前应用程序有权限访问读写,其他应用无权限访问。一些安全性要求比较高的数据存放在该目录,一般用来存放size比较小的数据。

Enviroment.getExternalStorageDirectory().getPath();  是一个外部存储目录,只用应用声明了<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>的一个权限,就可以访问读写sdcard目录;所以一般用来存放一些安全性不高的数据,文件size比较大的数据。

二、用SharedPreferences来做数据存储

    sharedPreferences是通过xml文件来做数据存储的, 一般用来存放一些标记性的数据和设置信息等。用SharePreferences做数据存储的一般步骤如下:

1.使用sharedPreferences存储数据             
            1.1.通过Context对象创建一个SharedPreference对象
                //name:sharedpreference文件的名称    mode:文件的操作模式
                SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
            1.2.通过sharedPreferences对象获取一个Editor对象
                Editor editor = sharedPreferences.edit();
            1.3.往Editor中添加数据
                editor.putString("username", username);
                editor.putString("password", password);
            1.4.提交Editor对象
                editor.commit();

2.使用sharedPreferences读取数据
            2.1.通过Context对象创建一个SharedPreference对象
                SharedPreferences sharedPreferences = context.getSharedPreferences("userinfo.txt", Context.MODE_PRIVATE);
            2.2.通过sharedPreference获取存放的数据
                //key:存放数据时的key   defValue: 默认值,根据业务需求来写
                String username = sharedPreferences.getString("username", "");
                String password = sharedPreferences.getString("password", "");

三、用数据库做数据存储

          当有量数据结构相同的数据需要存储时,适合用数据库存储。用数据库做数据存储的一般步骤如下:

1.创建一个类集成SqliteOpenHelper,需要添加一个构造方法,实现两个方法oncreate ,onupgrade
2.创建这个帮助类的一个对象,调用getReadableDatabase()方法,会帮助我们创建打开一个数据库对象SqliteDatabase
3.复写oncreate和onupgrdate方法:
        oncreate方法是数据库第一次创建的时候会被调用;  适合做表结构的初始化,需要执行sql语句;SQLiteDatabase db可以用来执行sql语句    
        //onUpgrade数据库版本号发生改变时才会执行; 适合做表结构的修改

对数据库进行增删该查操作:

1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象
2.使用SqliteDatebase对象调用execSql()做增删改,调用rawQuery方法做查询。

以下是实现增删改查的代码:

	private MySqliteOpenHelper mySqliteOpenHelper;
	public InfoDao(Context context){
		//创建一个帮助类对象
		mySqliteOpenHelper = new MySqliteOpenHelper(context);

		
	}
	public void add(InfoBean bean){
		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase 	db = mySqliteOpenHelper.getReadableDatabase();
		//sql:sql语句,  bindArgs:sql语句中占位符的值
		db.execSQL("insert into info(name,phone) values(?,?);", new Object[]{bean.name,bean.phone});
		//关闭数据库对象
		db.close();
	}

	public void del(String name){


		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
		//sql:sql语句,  bindArgs:sql语句中占位符的值
		db.execSQL("delete from info where name=?;", new Object[]{name});
		//关闭数据库对象
		db.close();

	}
	public void update(InfoBean bean){

		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
		//sql:sql语句,  bindArgs:sql语句中占位符的值
		db.execSQL("update info set phone=? where name=?;", new Object[]{bean.phone,bean.name});
		//关闭数据库对象
		db.close();

	}
	public void query(String name){
		
		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
		//sql:sql语句,  selectionArgs:查询条件占位符的值,返回一个cursor对象
		Cursor cursor = db.rawQuery("select _id, name,phone from info where name = ?", new String []{name});
		//解析Cursor中的数据
		if(cursor != null && cursor.getCount() >0){//判断cursor中是否存在数据
			
			//循环遍历结果集,获取每一行的内容
			while(cursor.moveToNext()){//条件,游标能否定位到下一行
				//获取数据
				int id = cursor.getInt(0);
				String name_str = cursor.getString(1);
				String phone = cursor.getString(2);
				System.out.println("_id:"+id+";name:"+name_str+";phone:"+phone);
			}
			cursor.close();//关闭结果集
			
		}
		//关闭数据库对象
		db.close();

	}
这种方式需要手动写sql语句,而且增删改不能判断是否执行成功。还有另外一种实现增删改查的方式如下:

1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象
2.使用SqliteDatebase对象调用insert,update,delete ,query方法做增删改查。

以下是利用这种方式实现增删改查的代码:

private MySqliteOpenHelper mySqliteOpenHelper;
	public InfoDao(Context context){
		//创建一个帮助类对象
		mySqliteOpenHelper = new MySqliteOpenHelper(context);
	}

	public boolean add(InfoBean bean){

		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase 	db = mySqliteOpenHelper.getReadableDatabase();
		
		
		ContentValues values = new ContentValues();//是用map封装的对象,用来存放值
		values.put("name", bean.name);
		values.put("phone", bean.phone);
		
		//table: 表名 , nullColumnHack:可以为空,标示添加一个空行, values:数据一行的值 , 返回值:代表添加这个新行的Id ,-1代表添加失败
		long result = db.insert("info", null, values);//底层是在拼装sql语句
	
		//关闭数据库对象
		db.close();
		
		if(result != -1){//-1代表添加失败
			return true;
		}else{
			return false;
		}
	}

	public int del(String name){

		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
		
		//table :表名, whereClause: 删除条件, whereArgs:条件的占位符的参数 ; 返回值:成功删除多少行
		int result = db.delete("info", "name = ?", new String[]{name});
		//关闭数据库对象
		db.close();
		
		return result;

	}
	public int update(InfoBean bean){

		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
		ContentValues values = new ContentValues();//是用map封装的对象,用来存放值
		values.put("phone", bean.phone);
		//table:表名, values:更新的值, whereClause:更新的条件, whereArgs:更新条件的占位符的值,返回值:成功修改多少行
		int result = db.update("info", values, "name = ?", new String[]{bean.name});
		//关闭数据库对象
		db.close();
		return result;

	}
	public void query(String name){
	
		//执行sql语句需要sqliteDatabase对象
		//调用getReadableDatabase方法,来初始化数据库的创建
		SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
		
		//table:表名, columns:查询的列名,如果null代表查询所有列; selection:查询条件, selectionArgs:条件占位符的参数值,
		//groupBy:按什么字段分组, having:分组的条件, orderBy:按什么字段排序
		Cursor cursor = db.query("info", new String[]{"_id","name","phone"}, "name = ?", new String[]{name}, null, null, "_id desc");
		//解析Cursor中的数据
		if(cursor != null && cursor.getCount() >0){//判断cursor中是否存在数据
			
			//循环遍历结果集,获取每一行的内容
			while(cursor.moveToNext()){//条件,游标能否定位到下一行
				//获取数据
				int id = cursor.getInt(0);
				String name_str = cursor.getString(1);
				String phone = cursor.getString(2);
				System.out.println("_id:"+id+";name:"+name_str+";phone:"+phone);
				
				
			}
			cursor.close();//关闭结果集
			
		}
		//关闭数据库对象
		db.close();

	}

这种方式增删改有了返回值,可以判断sql语句是否执行成功,但是查询不够灵活,不能做多表查询。所以一般增删改用第二种方式,查询用第一种方式。

数据库中的事务

事务:行多条sql语句,要么同时执行成功,要么同时执行失败,不能有的成功,有的失败

关于事务的一些API:

beginTransaction()      开启一个数据库事务

setTransactionSuccessful()    标记事务中的sql语句全部成功执行

endTransaction()      判断事务的标记是否成功,如果不成功,回滚错误之前执行的sql语句

以上是关于数据库中存储数据有关的内容。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值