Android手机数据保存的方式及注意事项

一.SharedPreference,以键值对的形式保存在xml文件中

少量的数据保存,一般用来保存应用程序的各种配置信息,有两种创建方式:

          1.     context.getPreferences(Context.MODE_PRIVATE);//创建的xml文件会以当前Activity的名字命名

          2.     getSharedPreferences("name", Context.MODE_PRIVATE);


Context.MODE_PRIVATE   以此中方式创建,   则只能本应用程序可对xml文件读写

Context.MODE_WORLD_READABLE         以此中方式创建, 其他应用程序可对xml文件只能读不能写

Context.MODE_WORLD_WRITEABLE     以此中方式创建, 其他应用程序可对xml文件能读写
向SharedPreference保存数据后,才会在/data/data/应用包名/shared_prefs 文件夹下创建对应的xml文件

      SharedPreferences sp= this.getPreferences(Context.MODE_PRIVATE);
      Editor e=sp.edit();
      e.putInt("age", 1);
      e.commit();
读取xml中的数据信息

       int age=sp.getInt("age", 0);
对应的xml文件中内容如下

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <int name="age" value="1" />
</map>
读取其他手机软件的SharedPreference

       try {
		Context c= createPackageContext("应用程序包名", Context.CONTEXT_IGNORE_SECURITY);
		SharedPreferences sp=c.getSharedPreferences("name", Context.MODE_WORLD_WRITEABLE);
	   } catch (NameNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	   }

二.保存为文件

  1.

       // 在/data/data/应用包名/创建files文件夹,在此文件夹下保存应用软件的资源文件,比如下载的图片,视频等
       File dir= context.getFilesDir();
       // 在/data/data/应用包名/创建cache文件夹   在此文件夹下,可以保存缓存的数据资料
       File cache= context.getCacheDir();

保存在这地方的数据,用户在手机的资源管理器(文件管理器)处,无法看到

在手机应用程序设置里面,如图

清除数据:是将/data/data文件夹下的所有数据清除

清除缓存:是将/data/data/cach 文件夹下数据清除

2.保存在sdcard中

注意判断sdcard是否存在

       if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    	   
       }
需要权限

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下面是向sdcard中的文件中,追加内容的示例代码

        try {
            File sdcardDir=Environment.getExternalStorageDirectory();
			File targetFile=new File(sdcardDir.getCanonicalPath()+"name.txt");
			RandomAccessFile raf=new RandomAccessFile(targetFile, "rw");
			raf.seek(targetFile.length());
			raf.write(new String("日照").getBytes());
			raf.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

三.使用SqliteDatabase

这是一个小型数据库,可以通过SqliteDatabase的静态方法创建或获取数据库:

经常通过继承自SQLiteOpenHelper的自定义类获取

public class ScxSqliteOpenHelper extends SQLiteOpenHelper {
	public static String CREATE_TABLE_SQL="CREATE TABLE IF NOT EXISTS my(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(64),age INTEGER(3),gender CHAR(2))";

	public ScxSqliteOpenHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL(CREATE_TABLE_SQL);
		Log.i("mi", "执行onCreate方法");

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}

}
        //不加路径的话比如test.db,文件所在的位置会在data/data/应用包名/databases/文件夹下,用户看不到
        //加路径比如:/mnt/sdcard/test.db,文件所在的位置就是在sdcard的根目录下,用户可以看到
        dbHelper=new ScxSqliteOpenHelper(getActivity(), "/mnt/sdcard/test.db", null, 1);
        SQLiteDatabase db=dbHelper.getReadableDatabase();
数据库的常用操作

插入数据,下面是两种实现方式:

	public void insert(){
		 SQLiteDatabase db=dbHelper.getReadableDatabase();
	     String temp="insert into my(name,age,gender) values(?,?,?)";
	     String sql="";
	     for(int i=0;i<10;i++){
	        Log.i("mi","sql="+temp);
	        db.execSQL(temp,new String[]{"李"+i,""+(i+3),(i%2==0?"男":"女")});
	     }
	     
	     //或者使用这种方式
//	     ContentValues values=null;
//	     for(int i=0;i<10;i++){
//	    	 values=new ContentValues();
//	    	 values.put("name", "李"+i);
//	    	 values.put("age", i+3);
//	    	 values.put("gender", i%2==0?"男":"女");
//	        //id 为插入的此条数据的_id或者-1(插入失败)
//	    	long id= db.insert("my",null,values);
//	     }
	     
	}
查询数据

	public void select(){
        SQLiteDatabase db=dbHelper.getReadableDatabase();
        String sql="select * from my";
        Cursor cursor=db.rawQuery(sql, null);
        //或者
//        cursor=db.query("my", null, null, null, null, null, "_id dest");
        if(cursor!=null){
        	String result="";
        	while(cursor.moveToNext()){
        		result="";
        		for(int i=0;i<cursor.getColumnCount();i++){
        			result+=cursor.getColumnName(i)+":"+cursor.getString(i)+";";
        		}
        		Log.i("mi",result);
        	}
        }

	}


更新数据

	public void update(){
        SQLiteDatabase db=dbHelper.getReadableDatabase();
        String sql="update my set name=?,gender=? where gender=?";
        db.execSQL(sql, new String[]{"joke","男","女"});
        
        //或者使用这种方式
//        ContentValues values=new ContentValues();
//        values.put("name", "david");
//        values.put("gender", "女");
//        //  num是有多少条数据被改变
//        int num= db.update("my", values, "gender=?", new String[]{"男"});
        
	}
删除数据:

	public void delete(){
        SQLiteDatabase db=dbHelper.getReadableDatabase();
        String sql="delete from my where gender=?";
        db.execSQL(sql, new String[]{"男"});
        //或者使用这种方式 
//      //  num是有多少条数据被改变
//      int num= db.delete("my", "gender=?", new String[]{"女"});
	}
SqliteDatabase处理事务时的注意事项:

        try {
        	//执行数据的增删改等操作
        	。。。。
        	//调用该方法设置事务成功;否则endTransaction()方法将回滚事物
            db.setTransactionSuccessful();
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			//由事务标志决定是提交事务还是回滚事务
	        db.endTransaction();
		}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值