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

来源:互联网 发布:mac准备安装时发生错误 编辑:程序博客网 时间:2024/05/24 06:03

一.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 blocke.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 blocke.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}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL(CREATE_TABLE_SQL);Log.i("mi", "执行onCreate方法");}@Overridepublic 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();}


0 0
原创粉丝点击