数据存储

来源:互联网 发布: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) 利用内容提供者解析器进行增删改查


0 0
原创粉丝点击