Android学习三 数据存储相关

来源:互联网 发布:知乎周刊和知乎一样吗 编辑:程序博客网 时间:2024/05/23 19:58

一、存储到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){//判断剩余空间是否小于200MToast.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");//创建fileFileOutputStream 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
原创粉丝点击