继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

数据存储的几种方式

浮云间
关注TA
已关注
手记 146
粉丝 16
获赞 47

一、Share Preferences共享参数(存储基本数据类型)---私有的

    共享参数的存储地址:data/data/应用程序包名/shared_prefs/文件名.xml

    1、是用键值对<Key, Value>的形式来存储数据的。当再次启动程序后依然保持原有设置。

    2、目前支持String、int、long、float、boolean等基本类型的存储,对于自定义的对象数据类型,无法使用    SharedPreferences来存储。

    3、SharedPreferences主要用于存储系统的配置信息。例如上次登录的用户名上次最后设置的配置信息

         像JSON字符串这种大数据和复杂数据就不用SharedPreferences来存储。

    使用SharedPreferences的步骤

        (1) 获取SharedPreferences对象

        (2) 调用edit()方法获取SharedPreferences.Editor

        (3) 通过SharedPreferences.Editor接口提供的put()方法对SharedPreferences进行更新

        (4) 调用SharedPreferences.Editor的commit()方法,将更新提交到SharedPreferences中

    存储数据

        //参数含义---存储的文件名(可以不用写后缀名,会自动添加.xml)  

        //操作模式:一般使用私有模式(也是默认的)

        SharedPreferences sp = getSharedPreferences("first", MODE_PRIVATE);

        Editor edit = sp.edit();

        edit.putString("s", "存储的字符串");

        edit.commit();     //提交数据

    // edit.clear();    //清空以前存储的数据(把key值得节点都清除掉)

    读取数据

       //读取存在的文件(一般存数据与取数据不放在同一个类中,所以就把文件名提出来放在常量类中)

        String s = sp.getString("s", "默认值");

二、Internal Storage内部存储(存储文件)---私有的

      写的路径和读的路径是一致的

       路径:data/data/当前项目的包名/文件名.后缀名

        File file = new File("data/data/com.shirly.day13innerstoragedemo/first.txt");

        路径:data/data/当前项目的包名/files/文件名.后缀名

        File file = new File(getFilesDir(), "second.txt");

        路径:data/data/当前项目的包名/cache/文件名.后缀名

        File file = new File(getCacheDir(), "third.txt");    //写入缓存文件

        路径:data/data/当前项目的包名/files/文件名.后缀名

        FileOutputStream fos = openFileOutput("fourth.txt", MODE_PRIVATE);


三、External Storage扩展存储(存储文件)---公共的

    1、对SD卡的读写权限和操作sd文件夹权限

        android.permission.WRITE_EXTERNAL_STORAGE

        android.permission.READ_EXTERNAL_STORAGE

        android.permission.MOUNT_UNMOUNT_FILESYSTEMS

    2、获得SD卡当前状态

        String state = Environment.getExternalStorageState();

        只有状态 MEDIA_MOUNTED 是正常状态

    3、获取SD卡的路径

        String path = Environment.getExternalStorageDirectory().getAbsolutePath();


四、SQLite Databases数据库存储

    SQL语句

        创建表:create table student(_id integer primary key autoincrement,

                                                name varchar(20), age integer(20), info text);

        新增:insert into student(name,age,info) values("Tom",18,"介绍1");

        删除:delete from student where age>20;

        查找:select name,age from student where name="Shirly";

        修改:update student set age=22 where _id=4;

        删除表:drop table if exists student


    数据库的帮助类    继承SQLiteOpenHelper

      (要创建数据库对象,就必须要这个帮助类

         必须实现的方法

            (1) onCreate(SQLiteDatabase db)

                 * 在第一次创建数据库的时候会调用的方法

                 * 在这个方法中一般创建表和初始化表中的数据

                 * @db        创建的数据库对象

            (2) onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

              * 数据版本升级的时候要调用的方法

                 * db        要操作的数据库的对象

                 * oldVersion        数据库的旧版本号

                 * newVersion    数据库的新版本号

            (3)构造方法  继承父类的构造方法

              super(context,  //上下文对象

                        name, //数据库名字

                        factory,  //游标工厂(创建数据)

                        version);    //数据库的版本号,从1开始的

        常用的方法

            getWritableDatabase()    //获取到一个可读可写的数据库对象

            getReadableDatabase()    //获取到的也是一个可读可写的数据库对象。但是在一些特殊情况下,比如磁盘满了,这个数据库对象就变成只读的了。


        操作步骤:

            MyHelper helper = new MyHelper(this, DB_NAME, null, 2); 

            SQLiteDatabase db = helper.getReadableDatabase();

            db.execSQL(sql, new Object[]{});    //增、删、改都用这一步

            查询:

             Cursor cursor = db.rawQuery("select name,age from student", null);

                //cursor.moveToNext():让数据游标依次向下一行移动,如果下一行有数据,返回true

                while(cursor.moveToNext()){

                    //根据列的名字获取列号

                    int nameInde = cursor.getColumnIndex("name");

                    int ageIndex = cursor.getColumnIndex("age");

                    //根据一行里面name字段所在的列号去获取数据(列号从0开始一次增加)

                    String name = cursor.getString(nameInde); 

                    int age = cursor.getInt(ageIndex);

                }

        用API封装好的方法:

       (1)db.insert(TABLE_NAME, null, values);

              *     TABLE_NAME:要插入的表名

                 *     null:没有插入的字段的默认值

                 *     values:要添加的数据

                 *     返回值:插入数据的行号ID。如果返回-1,代表插入数据失败

         (2)db.delete(TABLE_NAME, "name = ?", new String[]{"apple1"});

              *     table:表名

                 *     whereClause:筛选条件where语句(不包括关键字where)

                 *     whereArgs:如果筛选条件有?,那么whereArgs就是筛选条件的具体值

                 *     如果没有where筛选条件,那么后面两个参数都是null

                 *     返回值:删除的行数。如果等于0,说明删除失败

          (3)db.update(TABLE_NAME, values, "_id = ?", new String[]{"15"});

                 *     table:表名

                 *     values:要修改的数据

                 *     whereClause:筛选条件where语句(不包括关键字where)

                 *     whereArgs:如果筛选条件有?,那么whereArgs就是筛选条件的具体值

                 *     如果没有where筛选条件,那么后面两个参数都是null

                 *     返回值:修改数据,受影响的行数

          (4)db.query(TABLE_NAME,   //要查询的表名

                        new String[]{"_id", "name","price"},    //要查询的字段(如果要查询所有字段,则写null)

                        "name = ?",         //筛选条件where语句(不包括关键字where)

                        new String[]{"apple5"},     //如果筛选条件有?,那么selectionArgs就是筛选条件的具体值

                        null, null, null);

                    分页查询

                    //0:查询的第一条数据的下标

                    //10:查询的总共的数据条数

                    Cursor cursor = db.query("food", null, null, null, null, null, null, "0,10");

    数据库适配器    SimpleCursorAdapter

        cursorAdapter = new SimpleCursorAdapter(

                this,        //上下文对象

                android.R.layout.simple_list_item_2,  //每个item要展示的布局文件

                null,             //数据源(cursor)

                new String[]{"name", "price"},     //数据获取的来源    表的字段数组

                new int[]{android.R.id.text1, android.R.id.text2},    //数据的去处        item布局的控件id数组

                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);  //标记

        用SimpleCursorAdapter适配器时,必须要查询主键,不然会报错

五、Network Connection

原文链接:http://www.apkbus.com/blog-832543-61274.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP