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); }