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

来源:互联网 发布:金蝶erp软件介绍 编辑:程序博客网 时间:2024/06/04 19:28
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谢谢--------------------
0 0
原创粉丝点击