一、SharedPreferences
保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。
是一个较轻量级的存储数据的方法,适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。
默认存储路径:/data/data/<PackageName>/shared_prefs
注意事项:
1.
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。
2.
SharedPreferences本身是一 个接口!!,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例
3.
getSharedPreferences(String name, int mode)
该方法中name表示要操作的xml文件名,第二个参数为设置读写模式,有以下三种选择:
- Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应用程序读、写。
- Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应用程序读,但不能写。
- Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应用程序读,写。
4. 读取其他应用程序的SharedPreferences
a)首先需要获取其他应用程序的上下文Context
Context pvCount = createPackageContext("com.tony.app",Context.CONTEXT_IGNORE_SECURITY);这里的com.tony.app就是其他程序的包名
/*
flags 标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。
CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。
CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。
*/
b)获取该上下文环境下的SharedPreferences
SharedPreferences read = pvCount.getSharedPreferences("fristData", Context.MODE_WORLD_READABLE);
1)写操作步骤
//写操作
//step1 获取SharedPreference.Editor对象
SharedPreferences.Editor editor = getSharedPreferences("newFile", MODE_PRIVATE).edit();
//step2 写入键值对数据
editor.putString("firstData", "哈哈哈哈我是第一个数据");
//step3 提交
editor.commit();
2)读操作步骤
//读操作
SharedPreferences read = getSharedPreferences("newFile", MODE_PRIVATE);
//通过 键 获取数值
String val = read.getString("firstData", "");
二、文件存储
Context提供了FileOutputStream和FileInputStream两个文件输出输入流来进行文件的读写
openFileOutput(String name, int mode);为写入数据做准备而打开文件,如果指定的文件存在,则之间打开文件准备写入数据,否则创建一个“name”新文件。
openFileInput(String name);为读入数据做准备而打开文件名为“name”的文件。
int mode参数有以下选择:
MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可 以使用Context.MODE_APPEND
MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
读写文件注意:以字节数组byte[]的形式进行读写!!!!
1)写文件
//写文件
try {
FileOutputStream out = openFileOutput("test", Context.MODE_APPEND);
String message = "嘿嘿嘿嘿嘿嘿";
out.write(message.getBytes());//以字节数组的形式写入
out.flush();//冲洗输入缓存!!
out.close();//关闭写入流
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
2)读文件
//读文件
try {
FileInputStream in = openFileInput("test");
byte[] bytes = new byte[in.available()];//可取的容量
in.read(bytes);//以字节数组的形式读取
String message = new String(bytes);
Log.d("STag", message);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
三、SQLite
默认存储路径:/data/data/<PackageName>/databases
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据。
1)创建数据库
需要用到SQLiteOpenHelper类和SQLiteDatabase类
SQLiteOpenHelper:帮助类,用于辅助创建、更新数据库。一般自定义一个继承它的类,重载相关方法
SQLiteDatabase:内包含对数据进行增删改查的方法。注意在使用中,应调用SQLiteOpenHelper类中的getWritableDatabase()和getReadableDatabase()来创建数据库,由SQLiteOpenHelper类来决定何时调用这两个函数
a)自定义SQLiteOpenHelper类:
public class MyDBOpenHelper extends SQLiteOpenHelper {
//构造函数,参数一:上下文环境 参数二:数据库名 参数三:查询时返回的cursor 参数四:数据库版本
public MyDBOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//创建数据库
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//创建表 语法格式: 列名 数据类型 约束, ..., ...,
String create = "create table Stu (id INTEGER PRIMARY KEY AUTOINCREMENT, sname TEXT, snum TEXT, sage INTEGER)";
sqLiteDatabase.execSQL(create);
}
//升级数据库
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
SQLite具有以下五种数据类型:
数据类型 | 解释 |
---|---|
NULL | 空值 |
INTEGER | 带符号的整型,具体取决有存入数字的范围大小。 |
REAL | 浮点数字,存储为8-byte IEEE浮点数 |
TEXT | 字符串文本。 |
BLOB | 二进制对象。 |
b)创建数据库并获取读写权限
//创建数据库
MyDBOpenHelper myDBOpenHelper = new MyDBOpenHelper(this, "Student.db", null, 1);
SQLiteDatabase db = myDBOpenHelper.getWritableDatabase();//创建表,并获取读写权限
/*
getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,此时的数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错!!!。
getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。
*/
2)数据操作
a)增
将数据写入ContentValue类中,再调用SQLiteDatabase类的insert函数,将ContentValue插入其中
//把输入的数据,写入到ContentValue实例中
ContentValues contentValues = new ContentValues();//存储一行数据
//调用put函数,存储数据
contentValues.put("sname", name.getText().toString());//将输入的name存储到“sname”列中
contentValues.put("snum", num.getText().toString());
contentValues.put("sage", Integer.parseInt(age.getText().toString()));
//往数据库中插入一条数据
/*
* 1、第一个参数表名;
2、第二个参数是某些为空的列自动赋值null;
3、第三个参数是ContentValue对象。
* */
db.insert("Stu", null, contentValues);
Toast.makeText(MainActivity.this, "提交数据成功!", Toast.LENGTH_SHORT).show();
b)查
调用SQLiteDatabase类的query函数,注意该函数返回的是Cursor类对象,数据均封装在该对象中。
query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit):
方法各参数的含义:
table | 表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。 |
columns | 要查询出来的列名。相当于select语句select关键字后面的部分。 |
selection | 查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?” |
selectionArgs | 对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就 会有异常。 |
groupBy | 相当于select语句group by关键字后面的部分 |
having | 相当于select语句having关键字后面的部分 |
orderBy | 相当于select语句order by关键字后面的部分,如:personid desc, age asc; |
limit | 指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。 |
Cursor类:
获取数据的方法:(注意要先获取该”列名“所在的列序号columnIndex 从0开始编号)
(1)以字节数组的形式返回请求列的值:byte[] getBlob(int columnIndex)
(2)以字符串形式返回请求列的值:String getString(int columnIndex)
(3)以整数形式返回请求列的值:int getInt(int columnIndex)
(4)以 long 形式返回请求列的值:long getLong(int columnIndex)
(5)以浮点数形式返回请求列的值:float getFloat(int columnIndex)
(6)以双精度形式返回请求列的值:double getDouble(int columnIndex)
(7)返回给定列值的数据类型:int getType(int columnIndex)
(8)列值是否为空:boolean isNull(int columnIndex)
(9)以短形式返回请求列的值:short getShort(int columnIndex)