hello

Data Storage 数据存储方式

View:

Content:

1、关于数据存储

  任何的应用都要和数据打交道,数据的存储可以是临时性的(比如,存储在内存中)。大多数的数据存储都是要求持久性的,比如存储在文件中,常用的是用xml文件存储数据,也可以是数据库。你保存的数据可以使私有的(只有自己的应用可以访问),也可以是分享的(允许其他应用访问)。 关于android中的数据存储方式详细参考Data Storage

  名词解释:

    私有存储:只允许应用程序本身访问存储的数据方式。

    共享存储:允许其他应用程序访问存储的数据方式

2、数据存储方式

  1)、Shared Preferences(私有存储)

    SharedPreferences是android中用来存储数据的一种形式,通过SharedPreferences存储的数据只能允许自己的应用访问。这种方式数据会保存到应用程序目录下的一个xml文件中。文件名是你在调用getSharedPreferences()中指定的name的值,在调用getSharedPreferences()时你可以指定不同的访问模式通过mode值。你可以在你的应用中任何地方使用getSharedPreferences()访问你的数据。

  存储数据:

SharedPreferences user = getSharedPreferences("shared_note",MODE_WORLD_WRITEABLE); //shared_note存储文件名
    Editor edit = user.edit();
    edit.putString("name", "meng");
    edit.putString("password", "mengword");
    edit.commit();
    Intent intent = new Intent(Data_StorageActivity.this,MSharedPreferences.class);
    startActivity(intent);

  访问数据

    SharedPreferences user = getSharedPreferences("shared_note", MODE_WORLD_READABLE);
        String name = user.getString("name", "default name");
        String passwrod = user.getString("password", "default password");
        System.out.println("name: "+name+" password: "+passwrod);

  2)、Internal Storage 内部存储(私有存储)

    你可以通过一个文件来保存你的数据,默认的这种方式的存储是私有存储,当应用程序被卸载时这个文件也被删除。

  存储数据:(通过输出流来保存数据)

String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

  访问数据

FileInputStream fis = openFileInput("hello_file");
            byte[] data = new byte[fis.available()]; 
            fis.read(data);
            System.out.println("data: "+new String(data));

   提示:你可以使用缓存来提高效率,详细信息

  3)、Exernal Storage 外部存储

    所谓外部存储就是将数据存储到外部存储器上,包括SD card 或者手机内带的存储器,这样其它程序就可以访问,你也可以通过连接上USB来操作数据,就像在电脑上操作数据一样。

   提示:这将暴漏你的数据,你要考虑数据被修改或者SD card被移除对你的应用程序的应用。

   @1.调用 getExternalStorageState()方法检查存储介质状态(首先要做的),确保你可以访问外部存储介质。

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false
;String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

  @2.访问数据:在API level 8 以上,你可以调用 getExternalFilesDir()方法返回存储路径,当参数为null时,存储位置是在你的应用程目录下的files目录下。在API level 7 以上参照Accessing files on external storage

    提示:卸载程序是存储文件也会被删除,如果你不想自己的数据在卸载你的应用时删除参考下面的描述(@3)。

  @3.将数据共享存储在sd card上

    如果你不想自己的数据在卸载你的应用时删除,你可以将数据存储在sd card的公共目录中如Music/, Pictures/, Ringtones/等(这些目录在sd card的根目录下)。你可以指定type参数来选择存储位置。type的可选值是Environment类的一些常量,包括DIRECTORY_MUSIC, DIRECTORY_PICTURES,DIRECTORY_RINGTONES等。选择不同的type值系统会在适当的位置存储你的数据,这样当你的程序被卸载时数据就不会跟着删除了,关于使用缓存的情况,详细参考

  4)、Using Databases 数据库存储

    android系统支持用sqlite数据库来存储数据,你可以通过继承SQLiteOpenHelper并重写onCreate()方法来创建自己的数据库,数据库默认保存在你的应用程序下的databases目录下。

public class MSQLOpenHelper extends SQLiteOpenHelper {
    private static int DATABASE_VERSION = 1;
    public static String TABLE_NAME = "USER";
    private String TABLE_CREATE_SQL = "create table if not exists "+TABLE_NAME+" (_id intteger primary key,uname text,password text )";

    public static MSQLOpenHelper getInstance(Context context){
        return new MSQLOpenHelper(context,TABLE_NAME, null, DATABASE_VERSION);
    }    
    private MSQLOpenHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(TABLE_CREATE_SQL);
    }
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

    插入数据:

MSQLOpenHelper dbhelper = MSQLOpenHelper.getInstance(context);
      SQLiteDatabase db = dbhelper.getWritableDatabase();
      ContentValues values = new ContentValues();
      values.put("uname", "meng");
      values.put("password", "mengmima");
      db.insert(MSQLOpenHelper.TABLE_NAME, null, values);
      db.close();

    访问数据:

SQLiteDatabase db = openOrCreateDatabase(MSQLOpenHelper.TABLE_NAME, MODE_PRIVATE, null);
        //System.out.println("db: "+db);
        String uname ;
        String password;
        String columns[] = {"uname","password"};
        Cursor c = db.query("USER",columns , null, null, null, null,null);
        int count = c.getCount();
        while(!c.isLast()){
            c.moveToNext();
            uname = c.getString(c.getColumnIndex("uname"));
            password = c.getString(c.getColumnIndex("password"));
            System.out.println("uname: "+uname+" password:"+password);
        }

 

posted @ 2012-05-03 21:33  酸塔  阅读(529)  评论(0编辑  收藏  举报