android数据存储,可以分为五种,分别是:
1 使用SharedPreferences存储数据
2 文件存储数据
这五种的数据存储中,前四种是存储在本地的,网络存储数据,不是存储在手机中,而是网络请求数据,然后在写入。而网络请求,请求来的数据,需要分别对待,有的仅仅用户显示,再次跳回这个界面的时候,再次发送请求,从网络中获取。而有的需要我们
将数据存储起来,这个时候,可以使用SharedPreferences存储,可以使用文件存储,可以使用SQLite数据库存储,可以存储复杂的数据,但是执行效率相对低一些;也可以将数据放入到缓存中,而缓存中有涉及到很多知识,存储知识就变的很大,很多。其实还有一种数据存储,这个数据存储,是放入在src/assets文件下的资源,这些资源可以是json格式的数据,xml文件数据,还可以是其他格式的数据。
3 SQLite数据库存储数据
4 使用ContentProvider存储数据
5 网络存储数据
第一个讲到的是文件存储。
文件存储是将数据写入到一个文件中。文件存储,是用来存放大量数据,如文本,图片,音频。默认的存放路径/data/data/<>/files/***.***; 该处的<>是包名,后面的***.***是存储发文件名。
先看一段代码,从代码入手:
public void save(){
try {
FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
outStream.write(text.getText().toString().getBytes());
outStream.close();
Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
return;
}
catch (IOException e){
return ;
}
}
这里讲一些文件存储流程,和java文件读写一样,其实就是java文件读写,只不过android会默认路径。
首先会获取一个文件输入流FileOutputStream,获取流之后,就可以将信息写入到文件中,最后关闭掉。流程很简单。不过这里来看一下openFileOutPut(fileName,mode);中的fileName是不需要有‘/’分隔符的,并且当文件不存在的时候,android会自动创建该文件。而model是用来指定操作模式的。
它有四种模式,分别是:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
将信息写入到文件中,同时,还需要将文件读取出来。文件读取的流程,先获取到一个文件流,该流就是保存的信息。然后在解析成自己需要的数据。
public void load(){ try { FileInputStream inStream=this.openFileInput("a.txt");//获取流 ByteArrayOutputStream stream=new ByteArrayOutputStream();//通过byte[]桥梁,将文件写入到ByteArrayoutputStream中。 byte[] buffer=new byte[1024]; int length=-1; while((length=inStream.read(buffer))!=-1) { stream.write(buffer,0,length); } stream.close();<span style="white-space:pre"> </span>//关闭流 inStream.close(); text.setText(stream.toString()); Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e){ return ; } }
上面说到默认的文件路径名称。当需要这个名称的时候,如何获取呢,使用getFilesDir()方法用于获取/data/data//files目录。
下面,来介绍一个工具类,这个工具类可以将类写入到文件中,并且读取出来,就很方便。
/** * 文件读取工具 * Created by ice on 2016/6/7. */ public class FileUtil { /** * 文件序列化对象列表 * * @param obj * @param fileName * @param mode */ public static void writeObjsToFile(Object obj, String fileName, int mode) { if (obj == null || fileName == null) return; FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = SheBaoApp.getContext().openFileOutput(URLEncoder.encode(fileName, "UTF-8"), mode); oos = new ObjectOutputStream(fos); oos.writeObject(obj); oos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (oos != null) { oos.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 从序列化文件中读取对象列表 * * @param fileName * @return */ public static Object readObjsFromFile( String fileName) { if (fileName == null) return null; Object obj = null; FileInputStream fis = null; ObjectInputStream ois = null; try { fileName = URLEncoder.encode(fileName, "UTF-8"); if (SheBaoApp.getContext().getFileStreamPath(fileName).exists()) { fis = SheBaoApp.getContext().openFileInput(fileName); ois = new ObjectInputStream(fis); obj = ois.readObject(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (StreamCorruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (ois != null) { ois.close(); } if (fis != null) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } return obj; } /** * 判断文件是否存在 * @return */ public static boolean fileIsExists(Context context, String fileName) { try { File f = new File(context.getFilesDir(), fileName); if (!f.exists()) { return false; } } catch (Exception e) { return false; } return true; } //文件的写入方式参数:保存的信息,文件夹的名字,保存类型 // FileUtil.writeObjsToFile(loginInfoModel,Const.STUDENTINFO, Context.MODE_PRIVATE); //文件读取方式 参数:文件名 //FileUtil.readObjsFromFile(Const.STUDENTINFO); }