1)直接IO存储
a)存储状态(Environment.getExternalStorageState())
b)存储目录(Environment.getExternalStorageDirectory())
c)存储大小 StatFs sf=new StatFs(sdcard.getPath());
d)存储权限 android.permission.WRITE_EXTERNAL_STORAGE
说明:如何获得应用程序外置sdcard私有存储目录,
此目录中的数据有何特点?
a)getExternalCacheDir()
public void onClick(View v){ //获得res/raw目录的a文件的输入流 InputStream in=getResources().openRawResource(R.raw.a); //将a写到外置sdcard //1.外置sdcard的存储状态 String state=Environment.getExternalStorageState(); if(!state.equals(Environment.MEDIA_MOUNTED)){//mounted Toast.makeText(this,"请确保sdcard已链接", 1).show(); return; } //2.外置sdcard的存储目录大小 //应用程序公有存储目录 //File picDir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); //应用程序在sdcard的私有存储目录(数据在应用卸载时会被删除) File picDir=getExternalFilesDir(Environment.DIRECTORY_PICTURES); //File picDir=getExternalCacheDir(); StatFs sf=new StatFs(picDir.getPath()); 借助此对象获得磁盘的存储信息 int aSize=sf.getAvailableBlocks()*sf.getBlockSize(); FileOutputStream out=null; byte[]buf=new byte[1024]; int len=-1; try{ if(aSize<in.available()){ Toast.makeText(this, "空间不足", 1).show(); return; } //3.假如有空间则将a文件写入到sdcard的pictures目录 out=new FileOutputStream(new File(picDir,"a.jpg")); while((len=in.read(buf))!=-1){ out.write(buf, 0, len); } Toast.makeText(this, "写入ok!", 1).show(); }catch(Exception e){ e.printStackTrace(); }finally{ if(in!=null)try{in.close();in=null;}catch(Exception e){} if(out!=null)try{out.close();out=null;}catch(Exception e){} } } |
b)getExternalFilesDir(String type)
1)直接IO存储 (data/data/项目包/files):私有,应用卸载数据会被删除
a)openFileInput
b)openFileOutput
说明:直接IO存储时缓存目录的获得:getCacheDir()
//data/data/项目包/files private void ioStore01()throws Exception{ FileOutputStream out=openFileOutput("a1.txt", Context.MODE_PRIVATE);//Context.MODE_APPEND 存放 //data/data/项目包/files out.write("helloworld".getBytes()); out.close(); //========== byte buf[]=new byte[10]; FileInputStream in=openFileInput("a1.txt"); in.read(buf); Log.i("TAG",Arrays.toString(buf)); Log.i("TAG",new String(buf)); in.close(); } private void ioStore02()throws Exception{ 存放//data/data/项目包/cache File cacheDir=getCacheDir(); Log.i("TAG", "cacheDir="+cacheDir.getPath()); OutputStream out=new FileOutputStream(new File(cacheDir,"a1.txt")); out.write("helloworld".getBytes()); out.close(); Log.i("TAG", "cache write ok!"); } |
2)偏好存储(SharedPreferences):记录用户喜好
a)SharedPreferences (data/data/项目/share_prefs/XXX.xml)
b)Editor(存储key/value)
扩展:系统设置实现(参考uicommons/settings)
private void shareStore01(){ //获得SharedPreferences对象 SharedPreferences sp=getSharedPreferences("s1",Context.MODE_PRIVATE); //获得Editor对象 Editor et=sp.edit();//key/value //将数据存储到Editor对象 et.putString("phone","139"); et.putBoolean("state",true); //将Editor对象的数据写入到文件 share_pref文件夹 et.commit(); } private void shareStore02(){ //获得SharedPreferences对象 SharedPreferences sp=getSharedPreferences("s1",Context.MODE_PRIVATE); //读数据 String phone=sp.getString("phone","");//第二个参数为没找到值时的默认值 boolean state=sp.getBoolean("state", false); //输出 Log.i("TAG", "phone="+phone); Log.i("TAG", "state="+state); } |
a)SQLite 是一个开源,轻量级关系型数据库系统,底层使用c/c++实现。
b)SQLite 一般应用于便携式设备,无需启动服务。
c)Adnroid 内置了SQLite 数据库,可以存储联系人信息,媒体库信息,备忘录信息,。。。
d)Android SQLite 相关 API(SQliteDatabase,....)
c)SQLite 中SQL的应用? (DDL,DML,DCL)
SQLiteDatabase的常用方法 : 打开或创建数据库 openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)
插入一条记录 insert(String table,String nullColumnHack,ContentValues values)
删除一条记录 delete(String table,String whereClause,String[] whereArgs)
查询一条记录 query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)
修改记录 update(String table,ContentValues values,String whereClause,String[] whereArgs)
执行一条SQL语句 execSQL(String sql)
关闭数据库 close() |