数据存储
来源:互联网 发布:mac原版系统镜像下载 编辑:程序博客网 时间:2024/06/11 17:56
Android有四大本地存储的方法:
(1)文件存储; (2)SharedPreferences; (3)SQlite数据库; (4)contentprovider内容提供者
Android文件存储
1. 内部存储
(1) 存放的路径: data/data/包名
(2) API获取路径方法:
上下文.getFileDir() --->data/data/包名/files保存重要配置信息
上下文.getCacheDir() --->data/data/包名/cache缓存目录
(3) 文件权限:默认是私有的,不允许别的应用程序访问
创建共有文件: openFileOutput(文件名,模式)
可读的标识:Context.MODE_WORLD_READABLE
可写的标识:Context.MODE_WORLD_WRITEABLE
2. 外部存储
获取SD卡路径
Environment.getExternalStorageDirectory()
操作SD卡需要注意的地方
(1) 先要判断SD是否挂载
Environment.getExternalStorageState()返回值是否是 Environment.MEDIA_MOUNTED
(2) 判断SD卡可用空间
Environment.getExternalStorageDirectory().getFreeSpace() 换算用:Formatter.formatFileSize(上下文,size);
(3) 配置权限
读权限 android.permission.READ_EXTERNAL_STORAGE 写权限 android.permission.WRITE_EXTERNAL_STORAGE
SharedPreferences
1. 存放的路径
data/data/包名/shared_prefs
2. 获取SharedPreferences
上下文.getSharedPreferences(文件名,模式) 模式:设置Activity.MODE_PRIVATE
3. 存入数据
存入的格式:xml形式
4. 步骤:
(1) 获取Editor(编辑器)对象
Editor editor = sp.edit();
(2) 设置需要存入的值
editor.putString(Key,value);
(3) 提交存入的数据,如果不提交,数据不能存进去
editor.commit();
(4) 取出数据
sp.getString(key,默认值); 如果在sp里没有找到相应的key,返回的数据是你定义的这个默认值
Sqlite数据库
1. 数据库的创建
(1) 创建类继承SQLiteOpenHelper,实现里面的两个方法:
onCreate()-->当数据库第一次打开时候调用,此方法只会执行一次 onUpgrade()-->当版本号发生变化的时候调用,用来数据库的升级
(2) 实现父类的构造
Context:上下文 name:数据库名称 (无需在当前构造传入,直接定义成员变量就行) CursorFactory:游标工厂,默认null version:版本号 (无需在当前构造传入,直接定义成员变量就行)
(4) 当调用下列方法的时候,数据库才会被创建
getWritableDatabase(); getReadableDatabase();以上都是先以读写的方式打开数据库,如果数据库满了,此时数据库是只能读的状态,若是以getWritableDatabase打开的,就会报错,如果是用getReadableDatabase方式打开的,就不会
2. 表的创建
一般在onCreate()方法里初始化表结构
(1) 建表方法
db.execSQL();
(2) 建表语句:
create table表名(_id Integer primary key,...);
3. 表的更新
\在onUpgrade()方法里执行,根据方法里面的两个参数去进行逻辑判断: --->newVersion 这一次的数据库版本号 --->oldVersion上一次的数据库的版本号
4. Android下执行sql语句
(1) 增 (db.execSQL(sql,Object[]{}))
sql-->insert into tableName(columnName1,columnName2,...) values (?,?,...)
(2) 删 (db.execSQL(sql,Object[]{}))
sql-->delete from tableName where columnName=?
(3) 改 (db.execSQL(sql,Object[]{}))
sql-->update tableName set columnName1 = ? where columnName2 = ?
(4) 查 (db.rawQuery(sql,Object[]{}))
sql-->select * from tableName where columnName = ?
(5) 表中增加列 (db.execSQL(sql))
sql-->alter table tableName columnName type
5. 用API进行增删改查
(1) 增
ContentValues values = new ContentValues(); values.put(columnName, value); db.insert(tableName,null,values);
(2) 删
db.delete(tableName, "name=?", new String[]{value});
(3) 改
ContentValues values = new ContentValues(); values.put(columnName, value); db.update(tableName, values, "name=?", new String[] { value });
(4) 查
Cursor cursor = db.query(tableName, 需要查询的列, "name=?", new String[]{value},null,null, 排序);
6. 命令行进入数据库
sqlite3 数据库名称修改dos命令行编码 chcp 936-->GBK编码 65001-->utf-8
7. 事务
保证要么同时完成,要么同时失败 db.beginTransaction();-->开启事务 db.setTransactionSuccessful();-->操作成功 db.endTransaction();-->关闭事务
只有当程序走到了 setTransactionSuccessful()方法,才代表这一轮的操作都成功了,才会存入到数据库,
如果中途发生异常,逻辑会直接跳到endTransaction()方法,就不会存入到数据库
contentprovider 内容提供者
1. 自定义内容提供者步骤
写一个类继承 ContentProvider,实现里面四个方法
(1) 在清单文件里面注册
<provider
android:name="com.itheima.db.BankDBBackdoor"
android:authorities="自定义主机名" >
//注意:这里需要指定主机名,也就是对外提供的uri,一般的规则是应用程序包名
</provider>
(2) 在内容提供者代码内部定义UriMatcher -用于判断uri是否匹配
static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
mUriMatcher.addURI("在清单文件里面定义的authorities", "自定义匹配字符串", 成功返回的标识);
}
(3) 在增删改查执行的时候判断uri是否合法
int code = mUriMatcher.match(uri); //返回值是int类型的标识
2. 如何访问内容提供者步骤
(1) 创建内容提供者解析器
ContentResolver resolver = 上下文.getContentResolver();
(2) 定义要访问的Uri路径
Uri uri = Uri.parse("content://自定义主机名/自定义匹配字符串"
(3) 利用内容提供者解析器进行增删改查
- 数据存储
- 数据存储
- 数据存储
- 存储数据
- 存储数据
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 数据存储
- 如何设置QtreeWidgetItem勾选框的样式
- 10.19
- html&css 新手入门常遇到的bug总结
- git项目(提交-处理-冲突)
- PyCharm 安装科学计算包(Anaconda)for linux
- 数据存储
- cannot open TrueType font file for reading错误解决方法[ubuntu]
- 10.20
- 第一天的学习,重头拾起当年的C语言
- java读书笔记:Vector源码解读
- 基于Android的OpenGL ES 2.0学习笔记(1)
- 10.21
- 分享大家一些sublime text3 的注册码
- 浅析JAVA中toString方法的作用