Android开发中数据的5种存储方式简介.txt

3/1/2017来源:Android开发人气:1171

Android数据5种存储方式 一、文件存储:将数据存储到文件里,通过IO流对数据文件进行读写。 说明: 核心原理: Context提供了两个方法来打开数据文件里的文件IO流 FileInputStream openFileInput(String name); FileOutputStream(String name , int mode), 这两个方法第一个参数 用于指定文件名,第二个参数指定打开文件的模式。具体有以下值可选: 1、MODE_PRIVATE::为默认操作模式,代表该文件是私有数据,只能被应用本身访问, 在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。 可以使用Context.MODE_APPEND 2、MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件 3、 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。 4、MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入 文件存储位置: a/内部存储空间 手机内置的存储空间,空间有限,可贵,安全,稳定,保存比较重要的私有数据。 一般内部存储空间文件会保存在/data/data/<package_name>/files/路径下( 存入步骤: 1、使用Context.openFileOutput()方法获取到一个FileOutputStream对象 2、把待写入的内容通过write()方法写入到FileOutputStream对象中 3、调用close()方法关闭输出流 读取步骤: 1、调用openFileInput()方法,指定文件的名字,返回一个FileInputStream流 2、调用流的read()方法读取数据 3、调用close()方法关闭输入流 b/外部存储空间(SD卡) 常见的SD卡等,存储空间大,不稳定。 sd卡保存步骤:1、添加sd卡读写权限,判断sd卡状态,获取sd卡根路径 2、新建File对象,并获取FileOutputStream 3、把待写入的内容通过FileOutputStream流写入文件并关闭流 sd卡读取步骤:1、添加sd卡读写权限,判断sd卡状态,获取sd卡根路径 2、根据文件路径获得File对象,并获取FileInputStream 3、通过FileInputStream的read()方法读取数据 内部文件存储代码样例: //保存数据的方法 public void saveByInner(){ String content=et_save.getText().toString(); try { FileOutputStream out=openFileOutput(name, Context.MODE_PRIVATE);//以覆盖方式保存数据 out.write(content.getBytes()); out.close(); Toast.makeText(this,"已保存",Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //读取数据的方法 public void readByInner(){ try { FileInputStream input= openFileInput(name); byte[] buffer= new byte[1024]; int length=0; StringBuffer sb=new StringBuffer(); while ((length=input.read(buffer))!=-1){ sb.append(new String(buffer,0,length)); } input.close(); tv_read.setText(sb.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 外部存储空间sdk卡代码样例: //sd卡保存数据的方法 private void writeBySD(){ //先给在配置文件中给sdk卡添加读写权限,判断内存卡的状态 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//如果内存卡没有挂起 Toast.makeText(this,"内存卡未找到!",Toast.LENGTH_SHORT).show(); return; }else {//如果内存卡已经挂起可以找到,就找到根目录 String path=Environment.getExternalStorageDirectory()+ File.separator+name; File file=new File(path); try { FileOutputStream write=new FileOutputStream(file); String content=et_save.getText().toString(); write.write(content.getBytes()); write.close(); Toast.makeText(this,"SD卡存储成功!",Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //sd卡读取的方法 private void readBySD(){ //判断内存卡状态 if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(this,"内存卡未找到!",Toast.LENGTH_SHORT).show(); return; }else { String path=Environment.getExternalStorageDirectory()+File.separator+name; File file=new File(path); try { FileInputStream read=new FileInputStream(file); int length=0; StringBuffer sb=new StringBuffer(); byte[] buffer=new byte[1024]; while ((length=read.read(buffer))!=-1){ sb.append(new String(buffer,0,length)); } read.close(); tv_read.setText(sb.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } //存储动态权限的获取,适用于安卓6.0以上的部分机型(兼容模式) private void checkPermission(){ int code=ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if(code== PackageManager.PERMISSION_GRANTED){//已经有权限 writeBySD(); }else {//没有权限要动态获取,通过弹出的提示框让用户进行选择 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1); } } //重写onRequestPermissionsResult方法 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode==1&&grantResults[0]==PackageManager.PERMISSION_GRANTED){ writeBySD(); }else { Toast.makeText(this,"访问需要权限,请先获取权限",Toast.LENGTH_SHORT).show(); } }
二、SharedPerference首选项存储。 很多时候我们开发的软件需要向用户提供首选项设置功能,比如微信中设置接收到信息是否提示,是否响铃等。 SharedPreferences就是用来存储这部分轻量级的数据。其特点如下 1、轻量级,key-values键值对类型存储数据 2、核心原理是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下 (需要有权限才能打开,建议使用Root Explorer查看) 代码样例: /** * 通过SharedPerference存储 */ private void saveBySP(){ String content=et_save.getText().toString(); SharedPreferences sp=getSharedPreferences(sp_name,MODE_PRIVATE); sp.edit().putString("content",content).commit(); Toast.makeText(this,"存储成功",Toast.LENGTH_SHORT).show(); } /** * 通过SharedPerference读取 */ private void readBySP(){ SharedPreferences sp=getSharedPreferences(sp_name,MODE_APPEND); String content=sp.getString("content","缺省值");//读不到数据就显示默认缺省值 tv_read.setText(content); } 三、SQLite数据库存储:将数据存储到SQLite关系型数据库中 1.sqlite是用的时候才创建 2.oncreate:只执行一次。 *3、执行SQL语句:db.execSQL("update user set username=?, passWord=? where id=?",new Object[]{user.getUsername(),user.getPassword(),user.getId()}); 注意设置的字段和条件字段之间不能加逗号,否则会报出 near "where": syntax error (code 1): 类型的错误 思路:写一个User工具类,操作User表。 步骤:1.新建User实体类 2.新建UserServcie工具类:有一个Helper类的属性,在UserServcie的构造函数中实例化Helper类的实例 3.UserService中写一个addUser(User); 4.写一个查询所有: public List<User> queryAll() { SQLiteDatabase db = helper.getReadableDatabase(); List<User> list = new ArrayList<>(); //ResultSet Cursor cursor = db.rawQuery("select * from user", null); while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String username = cursor.getString(cursor.getColumnIndex("username")); String password = cursor.getString(cursor.getColumnIndex("password")); User user = new User(id, username, password); list.add(user); } return list; } 5.activity中写页面,实例化控件(两个EditeTest,一个Button,TextView) 6.点击添加按钮,先插入数据,然后查询所有,展示到Textview上面。 四、ContentProvider存储数据:跨应用存取数据 五、网络存储:通过网络技术从服务器端获取数据 --------------持续更新中,欢迎留言补充改正,O(∩_∩)O谢谢--------------------