数据的存储位置
内部存储:data/data/对应包名/files/文件名
外部存储:/storage/emulated/0/对应包名/文件
内部存储的读写
写
String file="data.text";
String setText = this.et_setText.getText().toString().trim();
FileOutputStream fos=null;
try {
fos=openFileOutput(file,*MODE_APPEND*);
fos.write(setText.getBytes());
fos.close();
}catch (Exception e){
e.printStackTrace();
}
打开的时候MODE属性值有:
MODE_PRIVATE:该文件只能被当前程序读写
MODE_APPEND:该文件的内容可以追加
MODE_WORLD_READABLE:该文件的内容可以被其他程序读
MODE_WORLD_WRITEABLE:该文件的内容可以被其他程序读写
读
String file2="data.text";
FileInputStream fin=null;
try{
fin=openFileInput(file2);
byte[] buffer=new byte[fin.available()];
fin.read(buffer);
String str=new String(buffer);
tv_getText.setText(str);
}catch (Exception e){
e.printStackTrace();
}
外部存储的读写
一、获取外部设备SD卡读写权限
**1.**首先静态申请权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--android.permission.WRITE_EXTERNAL_STORAGE:申请SD卡写权限,读权限自动申请了-->
2.然后动态代码添加权限申请由用户同意
ActivityCompat.*requestPermissions*(this,new String[]{
"android.permission.WRITE_EXTERNAL_STORAGE"},100);
requestPermissions:动态权限申请
第一个参数:显示上下文对象
第二个参数:权限列表用String数组装好
第三个参数:请求码
**3.**通过回调方法判断是否申请成功
/**
* 动态申请权限回调方法
* @param requestCode 请求码
* @param permissions 请求的权限列表
* @param grantResults 用户授予权限的结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==100){
for(int i=0;i<permissions.length;i++){
if(permissions[i].equals("android.permission.WRITE_EXTERNAL_STORAGE")&&grantResults[i]== PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "权限"+permissions[i]+"申请成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this, "权限"+permissions[i]+"申请失败", Toast.LENGTH_SHORT).show();
}
}
}
}
PackageManager.PERMISSION_GRANTED 获取SD卡的读写权限后会得到此值
二、获得外部存储路径
判断外部存储是否有用
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
获得外部存储位置
Environment.getExternalStorageDirectory()
三、写
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File SDPath= Environment.getExternalStorageDirectory();
File file=new File(SDPath,"Data.txt");
FileOutputStream fos=null;
try{
fos=new FileOutputStream(file,true);
Log.i("Tag","输出流打开成功"+file.toString());
fos.write(save.getBytes());
Toast.makeText(this, "存储完毕", Toast.LENGTH_SHORT).show();
}catch (Exception e){
e.printStackTrace();
}finally {
if(fos!=null){
try{
fos.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
五、读
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
FileInputStream fis=null;
try {
File SDPath= Environment.getExternalStorageDirectory();
File file=new File(SDPath,"Data.txt");
fis=new FileInputStream(file);
Log.i("Tag","输入流打开成功"+file.toString());
byte [] buff=new byte[fis.available()];
fis.read(buff);
String message=new String(buff);
tv_read.setText(message);
Toast.makeText(this, "读取完毕", Toast.LENGTH_SHORT).show();
}catch (Exception e){
e.printStackTrace();
}finally {
if(fis!=null){
try {
fis.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
SharedPreferences存储
SharedPreferences是Android平台上一个轻量级的存储类,当程序中有一些少量数据需要持久化存储时,可以使用SharedPreferences类进行存储。例如:用户名、密码、自定义一些参数等。
存储方式为:XML文件键值对形式存储
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="qq">123</string>
<string name="password">123</string>
</map>
存入数据
SharedPreferences sp=context.getSharedPreferences("文件名",*MODE_PRIVATE*);
SharedPreferences.Editor editor=sp.edit();
editor.putString("key",值);
editor.commit();
获取数据
SharedPreferences sp = getSharedPreferences("data", *MODE_PRIVATE*);
String data = sp.getString(*key*, "没有获取到数据");
删除数据
SharedPreferences sp=getSharedPreferences("data",*MODE_PRIVATE*);
SharedPreferences.Editor editor=sp.edit();
// editor.remove(key);//删除指定数据
editor.clear();//删除所有数据
editor.commit();
补充
\1. Context类中的getSharedPreferences()方法:
此方法接收两个参数,第一个参数用于指定SharedPreferences文件名称,如果指定的文件不存在会去创建一个SharedPreferences文件都是存放在/data/data//shared_prefs目录下的。第二个参数用于指定操作模式,目前只有MODE_PRIVATE这一种模式可选,他是默认的操作模式,和直接传入0效果是一样的,表示只有当前程序能够对SharedPreferences文件进行读写。其他两种模式因为安全性在Android4.2中被废弃。
\2. Activity类中的getPreferences()方法
这个方法和Context中的getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。
\3. PreferenceManager类中的getDefaultSharedPreferences()方法
这是一个静态方法,它接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。得到SharedPreferences对象之后,就可以开始向SharedPreferences文件中存储数据了。
主要可以分为3步实现
Ø 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
Ø 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔数据就可以使用putBoolean()方法,添加一个字符串则使用putString()方法。以此类推。
Ø 调用apply()方法将添加的数据进行提交,从而完成数据存储的操作。
SQLite数据库存储
SQLite是Android自带的一个轻量级的数据库,他运算速度快,占用资源少,支持基本SQL语法。
SQLite数据库可以存储大量数据,并且对其管理。
创建数据库
public MyHelper(@Nullable Context context) {
super(context, "user_data.db", null, 1);
}
创建数据表
/**
*第一次执行数据库时用于建表
*@param db
**/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table tb_user(_id integer primary key autoincrement,username varchar(20),pwd varchar(20))");
}
数据库版本更新时调用
/**
*版本发生变化时执行
*@param db
*@param oldVersion 旧的版本
*@param newVersion 新的版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
数据库进行升级时将构造函数中的第四个参数——数据库版本号调至比之前大的就行
onUpgrade一般执行删表的操作
基本方法
SQLiteDatabase db=myHelper.getWritableDatabase();//获得读写权限
db.beginTransaction();//开始事务
……//处理数据
db. setTransactionSuccessful();//提交事务
db.endTransaction();//结束事务
插入数据
SQL语句添加
SQLiteDatabase db=myHelper.getWritableDatabase();
db.beginTransaction();
try{
db.execSQL("insert into tb_user(username,pwd) values(?,?)",new String[] {
qq,password});
db.setTransactionSuccessful(); //提交事务
}catch (Exception e){
Log.*i*("Tag",e.getMessage());
e.printStackTrace();
}finally {
db.endTransaction();//执行结束
db.close();//关闭
}
insert类
SQLiteDatabase db=myHelper.getWritableDatabase();
db.beginTransaction();
try{
ContentValues values=new ContentValues();//创建内容值对象
values.put("username",qq);//插入username列的值
values.put("pwd",password);//
long id=db.insert("tb_user",null,values);//insert返回的是插入的行数,如果是大于0至少插入了一行数据
if(id>0){
result=true;
db.setTransactionSuccessful();//标注数据库事务执行成功
}
}catch (Exception e){
Log.*i*("Tag",e.getMessage());
e.printStackTrace();
}finally {
db.endTransaction();//执行结束
db.close();//关闭
}
查询数据
cursor=db.query("tb_user",null,"username like ?",new String[]{
"%"+content+"%"},
null,null,null);
//查询query方法最少有7个参数
//参数1是表名,参数2是要查询的列名,如果要查询所有列用null
//参数3是查询条件
//参数4是条件值
//参数5是分组
//参数6是分组后的筛选
//参数7是排序
//query方法的返回是游标对象。游标是数据库中指针
删除
int number=db.delete("tb_user","username=?",new String[]{
qq});
//delete方法的参数1是表名,参数2是条件,参数3是条件值
//delete方法的返回是影响的行数
修改
int row=db.update("tb_user",qq,"_id=?",new String[]{
"6"});
//update方法参数1是表名
//参数2是要修改的值
//参数3是修改条件:一般用主键
//参数4是条件值
//update方法的返回值是所影响的行数