android 存储数据与文件
Android提供了几种数据或文件的存储方式:
读写sdcard,SharedPreference, 数据库
下面初步了解一下。
一.读写sdcard。
android中文件读写到sdcard与一般java思路一样,通过I/O流进行读写。下面直接代码:
添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
public class SavecontentService { private Context context; public SavecontentService(Context context){ this.context=context; } //向sdcard中存储文件(filename为保存的文件名,content为保存在文件中的内容) public boolean saveContentToSdcard(String filename,String content){ boolean flag=false; FileOutputStream fileOutputStream=null; //获得存储卡所在路径 File file=new File(Environment.getExternalStorageDirectory(),filename); //判断sdcard是否可用 if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ try { fileOutputStream=new FileOutputStream(file); fileOutputStream.write(content.getBytes()); flag=true; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(fileOutputStream!=null){ try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } return flag; } //从sdcard中获取文件 public String getContentFromSdcard(String filename){ FileInputStream fileInputStream=null; //缓存的流,和磁盘无关,不需要关闭 ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); File file=new File(Environment.getExternalStorageDirectory(),filename); if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){ try { fileInputStream=new FileInputStream(file); int len=0; byte data[]=new byte[1024]; while((len=fileInputStream.read(data))!=-1){ outputStream.write(data,0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(fileInputStream!=null){ try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } return new String(outputStream.toByteArray()); } }
二.SharedPreference。
它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:
public class MySharedPreference { private Context context; public MySharedPreference(Context context){ this.context=context; } //保存信息 public boolean saveContent(String username,String password){ boolean flag=false; SharedPreferences sharedPreference=context.getSharedPreferences("userinfo",Context.MODE_PRIVATE); //对数据进行编辑 SharedPreferences.Editor edit=sharedPreference.edit(); //获取编辑器 edit.putString("username", username); edit.putString("password",password); flag=edit.commit(); //将数据保存至存储介质 return flag; } //获取信息 public HashMap<String,Object> getConten(){ HashMap<String,Object> map=new HashMap<String, Object>(); //userinfo为文件的名称,名称不用带后缀,后缀会由Android自动加上 Context.MODE_PRIVATE为文件的操作模式 SharedPreferences sharedPreference=context.getSharedPreferences("userinfo",Context.MODE_PRIVATE); String uname=sharedPreference.getString("username",""); //获取不到则默认为空 String pwd=sharedPreference.getString("password",""); map.put("username",uname); map.put("password",pwd); return map; } }
三.操作数据库。
android提供的SQLite是一个很小的关系数据库。我们通常通过SQLiteOpenHelper这个辅助类来管理数据库的创建和版本。
所有继承SQLiteOpenHelper的类必须实现下面的构造函数:
public DatabaseHelper(Context context,String name,CursorFactory factory,int version)
context ——上下文对象。name—— 数据库名称。factory—— 数据库游标工厂。version—— 数据库版本
该类的方法:
getReadableDatabase() getWriteDatabase() 通过这两个方法创建或打开一个可以读写的数据库,返回SQLiteDatabase对象对数据库进行操作。
public class DbOpenHelper extends SQLiteOpenHelper{ private static String name="myDb.db"; //数据库名 private static int version=1; //数据库版本号 public DbOpenHelper(Context context ) { super(context, name, null, version); } //数据库创建时 第一次被调用,完成数据表的创建 @Override public void onCreate(SQLiteDatabase db) { //支持数据库类型,整形,字符串类型,日期类型,二进制的数据类型 String sql="create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))"; db.execSQL(sql); } //升级数据库版本方法 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql="alert table person add sex varchar(8)"; //向表中插入一个属性 db.execSQL(sql); } }
对数据库操作的类:
SQLiteDatabase有对应的方法进行数据库才操作(参考API)
public class DbDemo{ DbOpenHelper helper=null; public DbDemo(Context context){ helper=new DbOpenHelper(context); } //增加数据 public boolean addObject(String[] args) { boolean flag=false; SQLiteDatabase database=helper.getWritableDatabase(); String sql="insert into person(name,address) values(?,?)"; database.execSQL(sql,args); flag=true; database.close(); return flag; } //删除数据 public boolean deleteObject(String[] args) { boolean flag=false; SQLiteDatabase database=helper.getWritableDatabase(); String sql="delete from person where id=?"; database.execSQL(sql,args); flag=true; database.close(); return flag; } //更新数据 public boolean updateObject(String[] args) { boolean flag=false; SQLiteDatabase database=helper.getWritableDatabase(); String sql="update person set name=?,address=?"; database.execSQL(sql); flag=true; database.close(); return flag; } //获取一条记录 public Map<String, String> getObject(String[] args) { Map<String,String> map=new HashMap<String, String>(); SQLiteDatabase database=helper.getReadableDatabase(); //获取数据库 String sql="select * from person where id=?"; Cursor cursor=database.rawQuery(sql, args); //获取游标 while(cursor.moveToNext()){ for(int i=0;i<cursor.getColumnCount();i++){ //获取列名 String name=cursor.getColumnName(i); //获取该列对应的数据 String value=cursor.getString(cursor.getColumnIndex(name)); map.put(name, value); } } return map; } //获取一组数据 public List<Map<String, String>> getlistObject(String[] args) { List<Map<String,String>> list=new ArrayList<Map<String,String>>(); SQLiteDatabase database=helper.getReadableDatabase(); String sql="select * from person"; Cursor cursor=database.rawQuery(sql, args); while(cursor.moveToNext()){ Map<String, String> map=new HashMap<String, String>(); for(int i=0;i<cursor.getColumnCount();i++){ String name=cursor.getColumnName(i); String value=cursor.getString(cursor.getColumnIndex(name)); map.put(name, value); } list.add(map); } return list; } }
测试类:
public class MyTest extends AndroidTestCase{ private final String TAG="MyTest"; public MyTest(){ } /* * 存储数据到数据库 */ public void creartDb(){ DbOpenHelper openhelper=new DbOpenHelper(getContext()); openhelper.getWritableDatabase(); } public void addobject(){ DbDemo service=new DbDemo(getContext()); String[] objects={"fb","湖南"}; boolean flag=service.addObject(objects); Log.i(TAG, "---->>"+flag); } }