android 存储数据与文件

    Android提供了几种数据或文件的存储方式:

    读写sdcardSharedPreference, 数据库

下面初步了解一下。

一.读写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);
    }
}