一、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