Android存储目录

Android的底层支持是Linux,不同于Windows,没有分盘的概念,是以文件夹形式呈现,可以理解为一个应用就是一个用户。

data目录

手机内部存储目录(手机本身内存)

mnt

手机外部存储目录(SD卡)

Android手机存储目录结构

应用程序目录展开

/data/data目录

开发的程序都存储在这个目录下。

/data/data目录存储手机程序

/data/data/应用包名/cache目录

一般用来缓存不重要的数据,保存图片。

/data/data/应用包名/databases目录

一般用来存放数据库文件,SQLite。

/data/data/应用包名/files目录

一般保存的是重要的信息,用户信息,应用配置。

/data/data/包名/结构

Android文件存储

通过Environment类,获取目录。

Environment提供的API都是静态的,可以直接.

检测SDCard是否挂载:getExternalStorageState()

获取SDCard目录:getExternalStorageDirectory()

获取/data目录:getDataDirectory()

获取下载/缓存内容目录:getDownloadCacheDirectory()

private void demo() {

File dataDirectory = Environment.getDataDirectory();

File storageDirectory = Environment.getExternalStorageDirectory();

File downloadCacheDirectory = Environment.getDownloadCacheDirectory();

String state = Environment.getExternalStorageState();

if (state.equals(Environment.MEDIA_MOUNTED)) {

Log.i(TAG, "SDCard exists");

}else{

Log.i(TAG, "SDCard not exists");

}

}

Context 提供的获取目录API

获取/data/data/包名/cache目录:getCacheDir()

获取/data/data/包名/files目录:getFilesDir()

private void demo() {

File filesDir = getFilesDir();

File cacheDir = getCacheDir();

}

openFileOutput,openFileInput

Activity 提供的API

获取输入流:openFileOutput()

获取输出流:openFileInput()

FileOutputStream fops = openFileOutput(name, MODE_PRIVATE);

参数

1.指定文件名称,不能包含路径分隔符"/" 。

2.文件权限

只在本程序内读写:MODE_PRIVATE

追加内容:MODE_APPEND

如果文件不存在,Android 会自动创建它。

创建的文件保存在/data/data//files目录。

FileInputStream fips = openFileInput(path);

private void demo() {

try {

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

FileInputStream fis = openFileInput("demo.txt");

fos.write("write demo".getBytes());

fos.flush();

int len;

byte[] buf = new byte[1024];

while ((len = fis.read(buf)) != -1) {

Log.i(TAG, new String(buf, 0, len));

}

fis.close();

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

运行时权限

Android 6.0 后将权限分为两类

普通权限

不会直接威胁到用户的隐私和安全,系统会自动帮我们授权。

运行时权限

能直接威胁到用户隐私安全的操作,需要运行时用户手动授权。

Android危险权限

CALENDAR(日历)

READ_CALENDAR

WRITE_CALENDAR

CAMERA(相机)

CAMERA

CONTACTS(联系人)

READ_CONTACTS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION(位置)

ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE(麦克风)

RECORD_AUDIO

PHONE(手机)

READ_PHONE_STATE

CALL_PHONE

ERAD_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

SENSORS(传感器)

BODY_SENSORS

SMS(短信)

SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE(存储卡)

READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

通过读写SDCard,看程序运行时申请权限

1.在AndroidManifest.xml声明权限

2.

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

private Context mContext;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mContext = this;

writeSdcard();

getPermission();

}

private void getPermission() {

//检查权限是否存在

if (ContextCompat.checkSelfPermission(mContext,

Manifest.permission.WRITE_EXTERNAL_STORAGE)

!= PackageManager.PERMISSION_GRANTED) {

//向用户申请授权

ActivityCompat.requestPermissions(this, new String[]{

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.READ_EXTERNAL_STORAGE

}, 1);

} else {

writeSdcard();

}

}

private void writeSdcard() {

if (Environment.MEDIA_MOUNTED.equals(

Environment.getExternalStorageState())) {

File extDir = Environment.getExternalStorageDirectory();

File goalFile = new File(extDir, "writeSdcard.txt");

try {

BufferedWriter bw = new BufferedWriter(new FileWriter(goalFile));

BufferedReader br = new LineNumberReader(new FileReader(goalFile));

bw.write("Write writeSdcard data");

bw.flush();

String len;

while ((len = br.readLine()) != null) {

Log.i(TAG, len);

}

br.close();

bw.close();

} catch (IOException e) {

e.printStackTrace();

}

} else {

Log.i(TAG, "SDCard not exists");

}

}

//用户授权完后回调

@Override

public void onRequestPermissionsResult(int requestCode,

@NonNull String[] permissions,

@NonNull int[] grantResults) {

switch (requestCode) {

case 1:

if (grantResults.length > 0 &&

grantResults[0] == PackageManager.PERMISSION_GRANTED)

writeSdcard();

else

Log.i(TAG, "not permission");

break;

}

}

}

SharedPreferences键值存储

SharedPreferences是一种轻型的数据存储方式,本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。

获取SharedPreferences对象

1.Context提供的方式

getSharedPreferences("spName", MODE_PRIVATE);

2.Activity提供的方式

以当前类名作为 sp 的文件名

getPreferences(MODE_PRIVATE);

3.PreferenceManager提供的方式

使用当前应用程序的包名作为前缀来命名sp

PreferenceManager.getDefaultSharedPreferences(this);

private void demo() {

getSharedPreferences("spName", MODE_PRIVATE);

getPreferences(MODE_PRIVATE);

PreferenceManager.getDefaultSharedPreferences(this);

}

存储数据和获取数据

private void demo() {

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

sp.edit().putString("key", "value").apply();

String result = sp.getString("key", "default");

Log.i(TAG, result);

}

SQLite存储

Android内置数据库,支持标准的SQL语法,遵循ACID事务。

SQLite支持的数据类型

数据类型

整型

Integer

实数型

Real

字符型

Text

二进制

Blob

空值

Null

DDL

1.Create table

借助Android提供的抽象类SQLiteOpenHelper,可以建表和升级数据库。

public class MyDataBaseHelper extends SQLiteOpenHelper {

public static final String DB_NAME = "demo.db";

public static final int DB_VERSION = 1;

public static final String TABLE_NAME = "t_studen";

public MyDataBaseHelper(Context context) {

super(context, DB_NAME, null, DB_VERSION);

}

//当数据库文件创建时调用,可以在此方法创建多个数据库表

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL("create table " + TABLE_NAME +

"(_id integer primary key autoincrement," +

"name text," +

"age real)");

}

//升级数据库,可以删除/添加/修改数据库表

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

//如果想升级表,比如添加一个字段,要先删除之前存在的表

db.execSQL("drop table if exists " + TABLE_NAME);

onCreate(db);

}

}

2.Context也提供了一个方法来打开或创建数据库。

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

SQLiteDatabase db = openOrCreateDatabase("demo.db", MODE_PRIVATE, null);

db.execSQL("create table tt_student(" +

"_id integer primary key autoincrement," +

"name text," +

"age real)");

}

DML

SQLiteOpenHelper中提供了两个实例方法,用来打开或创建一个数据库,并返回一个可以对数据库进行读写的对象(SQLiteDatabase)。

1.getWritableDatabase()

先尝试用读写的方式打开数据库,如果磁盘满了,将会报错。

2.getReadableDatabase()

直接以读写的方式打开数据库,如果磁盘满了,就用只读的方式打开数据库。

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

private MyDataBaseHelper mDbHelper;

private SQLiteDatabase mSQLDb;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

loadDataBase();

insertData();

updateData();

deleteData();

queryData();

}

private void loadDataBase() {

mDbHelper = new MyDataBaseHelper(this);

mSQLDb = mDbHelper.getReadableDatabase();

}

private void insertData() {

ContentValues cv = new ContentValues();

cv.put("name", "张三");

cv.put("age", 18);

mSQLDb.insert(MyDataBaseHelper.TABLE_NAME, null, cv);

cv.clear();

cv.put("name", "李四");

cv.put("age", 19);

mSQLDb.insert(MyDataBaseHelper.TABLE_NAME, null, cv);

}

private void updateData() {

ContentValues updateCv = new ContentValues();

updateCv.put("name", "王五");

mSQLDb.update(MyDataBaseHelper.TABLE_NAME,

updateCv,

"_id = ?",

new String[]{"2"});

}

private void deleteData() {

mSQLDb.delete(MyDataBaseHelper.TABLE_NAME, "_id > ?", new String[]{"3"});

}

private void queryData() {

Cursor cursor = mSQLDb.rawQuery("select * from " +

MyDataBaseHelper.TABLE_NAME,

null);

String[] columnNames = cursor.getColumnNames();

while (cursor.moveToNext()) {

for (String item : columnNames) {

String name = cursor.getString(cursor.getColumnIndex(item));

Log.i(TAG, "queryData: " + name);

}

}

cursor.close();

}

}

数据库事务

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//打开或创建一个数据库

SQLiteDatabase db = openOrCreateDatabase("demo.db", MODE_PRIVATE, null);

//开启事务

db.beginTransaction();

try {

//没有异常就提交

db.setTransactionSuccessful();

} catch (Exception e) {

//如果抛异常,就回滚

db.endTransaction();

}

}

android方法数据库的权限,Android数据存储,运行时权限相关推荐

  1. Android 11.0 系统默认授予app安装权限(去掉app首次运行时权限授权弹窗)

    目录 1.概述 2.系统默认授予app安装权限去掉app首次运行时权限授权弹窗功能分析

  2. Android 12.0首次开机默认授予app运行时权限(去掉运行时授权弹窗)

    目录 1.概述 2.首次开机默认授予app运行时权限(去掉运行时授权弹窗)的解决方案的核心类

  3. 聊一聊Android 6.0的运行时权限

    Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...

  4. 如何优雅地申请Android运行时权限

    转载本文需注明出处:微信公众号EAWorld,违者必究. 前言: Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识.在默认情况下任何应用都没有权限执行对其他应用.操作系统或用 ...

  5. Android 8.0 运行时权限策略变化和适配方案

    Android8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过AndroidStudio3.0 Canary版本下载Android O最新的系统映像的Developer Pr ...

  6. Android运行时权限 1

    Android 运行时权限 一.Android 权限发展史 二.Android6.0 权限简介 1.Normal Permissions (普通权限) 2.Dangerous Permissions ...

  7. Android RuntimePermissions运行时权限:单个运行时权限申请简例

    Android RuntimePermissions运行时权限:单个运行时权限申请简例 Android运行时权限申请的框架结构和步骤比较简单和固定,一般现状代码启动后检查当前的Android SDK版 ...

  8. Android8.0运行时权限策略变化和适配方案

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com Android8.0也就是Android O即将要发布了,有很多新特性,目前我们可以通过Android ...

  9. Android基础入门教程——6.2 数据存储与访问之——SharedPreferences保存用户偏好参数

    Android基础入门教程--6.2 数据存储与访问之--SharedPreferences保存用户偏好参数 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家介绍的是第二种存储用 ...

最新文章

  1. 063_object标签
  2. 裁员这件事,谁也没有鲍尔默、纳德拉这两届微软CEO演绎的淋漓尽致
  3. 贾跃亭画了一个8500亿的大饼
  4. [Java核心技术(卷Ⅰ)] - 判断相等
  5. Springboot01创建第一个程序
  6. String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小
  7. 2018-2019-1 20189204《Linux内核原理与分析》第一周作业
  8. Vsftp的PASV模式和Port模式及VsFTP配置方案
  9. springsecurity实现记住我的功能,将用户的登录信息保存到本地浏览器,即使关闭浏览器也不用登录
  10. 【有利可图网】推荐!设计师必备配色宝典!
  11. 单片机技术及应用:基于proteus仿真的c语言程序设计,《单片机的C语言程序设计与应用——基于Proteus仿真(第3版)》怎么样_目录_pdf在线阅读 - 课课家教育...
  12. hexo yilia 文章浏览量统计
  13. Sklearn常用数据预处理方法介绍
  14. OJ刷题之《寄居蟹与海葵》
  15. python多线程结束线程_Python多线程和Office第2部分
  16. sql--sqlsever--时间相关SQL语句--查询当前时间至前N天的数据
  17. 【DASH】低延迟流式传输和新算法
  18. 15年上半年系统集成项目管理工程师案例分析真题及答案
  19. 快速上手 Flutter 空安全
  20. windows下快速安装nginx 并配置 开机自启动

热门文章

  1. 深度学习-83:金融科技公司
  2. 真正让你明白Hive参数调优系列1:控制map个数与性能调优参数
  3. 《大话设计模式》——读后感 (4)为别人做嫁衣?——动态代理模式(2)
  4. 家用汽车维修6: 06 sienna LE 维修(1)
  5. 多个网站共用一个服务器权重,一个服务器多个站点会不会分散权重
  6. android日记本功能界面图片,基于android的日记本的设计和开发.ppt
  7. web前端开发第一阶段——清除浮动/选择器优先级/特殊转义字符
  8. 【Demllie航天】宇宙飞船与火箭,着陆与回收
  9. 光电编码器的原理及应用场合_【技术浅析】编码器原理在数控系统维修中的应用...
  10. 使用A* (AStar)算法自动求解拼数字游戏