Android中数据的存储和访问

本文详细介绍了Android中数据存储的几种方式,包括文件存储、SharedPreferences、SQLite数据库和Content Provider的使用。文件存储可以使用openFileOutput()进行操作,SQLite用于结构化数据,SharedPreferences适合保存偏好设置。Content Provider作为数据共享机制,允许不同应用间的数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据存储的位置有两个:手机自带的存储空间(电脑的自带硬盘)和外存储设备(sdcard,移动硬盘,也有可能是固定在手机内部,用usb链接电脑后可以看到的存储设备)

当使用context的openFileOutput()来保存文件时,文件会被保存在手机自带的存储空间中,而且根据保存时操作模式的不同而权限不同。手机自带的存储空间通常较小,适合存放一些小的文件。大的文件通常存放在SDCard中,保存在SDCard中的文件是其他应用都能访问的。

SDCard使用方法:

第一步:添加SDCard使用权限

第二步:判断SDCard是否可用Environment.getExternalStorageState();

                   需要判断两个状态 是否安装了SDCard(MEDIA_MOUNTED);是否有写保护(MEDIA_MOUNTED_READONLY)

第三步:保存文件

File file = new File(“/mnt/sdcard”,filename);

FileOutputStream outStream = newFileOutputStream(file);

outStream.write(content.getBytes());

outStream.close();

在SDCard中创建文件时,文件目录通过Environment.getExternalStorageDirectory()获得可以屏蔽掉一些版本的差异。

 

数据存储的方式有五种:

1.      文件

实际上是用javaSE中的IO技术

1)  通过上下文对象context快速得到文件输出流对象

FileOutputStreamoutStream=context.openFileOutput(filename,mode);

outStream.write(str.getBytes());

Filename:输出流所写文件的文件名

Mode:权限控制及写入方式(追加,覆盖…)

eg:context.MODE_PRIVATE,私有操作模式:创建出来的文件只能被本应用使用,其他应用无法访问该文件,并且以覆盖方式写入

          因为是字节输出流,所以要将写入内容转换成字节

         通过这种方式,文件会被保存在data/data/packagename/files文件夹下面

2)  通过上下文对象context快速得到文件输出流对象

FileInputStream inStream=context.openFileInput(filename);

ByteArrayOutputStream outStream=new ByteArrayOutputStream();//字节数组输出流对象,用来缓存字节数组在内存中

Byte []buffer=new byte[1024];

While((len=inStream.read(buffer))!=-1)//读到文件结尾时read方法返回-1

{

            outStream.write(buffer,0, len);

}

Byte [] data = outStream.toByteArray();

3)  创建文件时所使用的操作模式

Context.MODE_PRIVATE:默认操作模式,如上述。

Context.MODE_APPEND:追加操作模式,检查文件是否存在,存在就往文件末尾追加内容;若不存在,就创建文件,创建的文件只能被本应用访问。

Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用写入

Context.MODE_WORLD_WRITABLE:表示当前文件可以被其他应用写入

Android有一套自己的安全模型,当应用程序在安装时系统会分配给它一个userid,当该应用要去访问其他资源比如文件时,就需要userid匹配。默认情况下,任何应用创建的文件,SharedPreferences,数据库都应该是私有的(位于/data/data/<packagename>/files/)其他应用无法访问。除非在创建时就指定了context.MODE_WORLD_WRITABLE或者context.MODE_WORLD_READABLE

2.      SharedPreferences(偏好参数保存)

很多时候我们开发的软件需要向用户提供软件参数设置的功能。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件或者xml进行保存。如果是android应用,我们用什么方式保存软件配置参数呢?Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用sharedpreferences保存数据,其背后是用xml文件存放数据,相当于是该类封装了对xml文件进行操作的一些方法,保存的xml文件存放在/data/data/<packagename>/shared_prefs目录下。

使用步骤:

1)  保存:

第一步:获得sharedPreferences类的对象。

     SharedPreferencessharedPreferences=context.getSharedPreferences(filename,mode);

     Filename是SharedPreferences内部所使用的xml文件的名称,不要自己加上后缀名.xml,mode是操作模式

第二步:获取编辑器,并利用编辑器保存内容

     Editoreditor=sharedPreferences.edit();

     Editor.putString(key,value);

     Editor.putInt(key,value);

 第三步:提交修改,第二步实际并未写入xml文件

     Editor.commit();

2)  读取

Map<string ,string> params = new HashMap<String, String>();

第一步:获得sharedPreferences对象

SharedPreferences preferences = context.getSharedPreferences(“itcast”,Context.MODE_PRIVATE);

 第二步:从对象中读取参数

Params.put(“name”, preferences.getString(key , defualtvalue));

Params.put(“age”,String.valueOf(preferences.getInt(“age”,0)));

key是键值,通过key来查找得到值,defualtvalue是当该键值不存在时,返回一个默认的值。

3.      SQLite数据库

Android对SQLite数据库提供了全面的支持。在一个应用中创建的数据库,可以被该应用中的任何类按照数据库的名字来访问,但是不允许别的应用访问。

1)  创建数据库:推荐的方法是继承SQLiteOpenHelper类,然后重载它的onCreate方法,在这个方法中可以通过执行SQLite的命令来创建表。

SQLiteOpenHelper的方法:


构造函数: name为数据库的名称,若该数据库不存在则创建该数据库,version是数据库的版本号,注:通过构造方法获得该类的实例时,并不会创建或者打开数据库,而是在通过该对象调用getWritableDatabase()和getReadableDatabase()时才会创建或者打开数据库。

onCreate()方法:数据库创建时调用,一般在此方法中建表。若是数据库存在,则不会再调用该方法。

onUpgrade()方法:当数据库存在,且新建该类实例对象时所传入的版本号比之前的版本号大时,会调用此方法。一般在此方法中更新表的结构。如果想要在获得数据库时,调用此方法,则应该将版本号增加。

1)  数据库的业务处理,增删改查。有两种方法:

传统的sql语句

添加、删除、修改所用到的函数是一样的


先通过helper获得可写入的数据库,准备好sql语句和相应参数,通过调用execSQL(String sql,Object[] params)来执行。其中sql语句中可能含有?占位符,会用字符串数组params来赋值。

查询操作:

分为单条查询和多条查询:

首先获得可读取的数据库,准备好sql语句和参数,调用rawQuery()来执行,返回一个Cursor对象,指向第一条返回记录之前。通过cursor可以获得返回记录的列数,然后循环记录每列的列名和值,注:列数是从0开始。可以用map<string,string>对象来存储行记录。在多条查询时,用list<map<String,String>>来保存返回结果。

Android封装好的方法

一般来说,上述方法无法返回SQL执行所影响的行数,使用Android封装的方法更为简便。

在数据库中插入记录:


注意其中的第二个参数StringnullColumnHack.这个参数是可选的,或为空,或者指定某一列的列名。如果为空,则不允许插入空记录,即values里没有存放任何东西。如果指定某一列,那么如果遇到空记录,系统会将该列的值赋值为null,然后插入。ContentValues类型相当于一个Map,存放了所需要更新的列名,和更新值。

在数据库中删除记录:


在数据库中更改记录:


在数据库中查询数据:


4.      内容提供者(Content Provider)

内容提供者管理了对一组结构化数据访问,即提供了一组接口(方法)来响应数据访问端的请求。内容提供者封装了数据,提供了一种应用间共享数据的机制。如果需要将本应用的数据对外进行共享,你需要创建一个ContentProvider,而其他的应用访问这些共享的数据时,通过ContentResolver来进行访问。

URI:android系统中一般有很多个ContentProvider,如何访问指定的ContentProvider呢?需要uri来唯一标识一个ContentProvider。在Provider端(相当于服务器),有一个待匹配的uri(通常会在这里使用通配符,#代表任意长度的数字,*代表任意长度的字符串),在Resolver端,如果要访问某个Provider,要给出访问的uri。

URI格式:content://authority/path

                    Content://authority/path/id

第一条表示操作的数据是多条数据(通常是一个表),第二条表示操作的是某一条记录。

Authority是在配置文件中申明ContentProvider时所指定的唯一的标识符。

而在Provider端,uri所表示的意义:

Com.example.sqlitetest/* :表示的是该Provider里的所有表

Com.example.sqlitetest/student:表示该Provider只允许操作student表里的内容

Com.example.sqlitetest/student/#::表示该provider只允许操作student表里的某一条记录

ContentProvider使用方法:

1.      因为ContentProvider是android四大组件之一,所以需要在配置文件中进行声明。


2.      编写Provider类实现ContentProvider父类,并覆盖其中的抽象方法。

需要定义的常量,其中的URIMatcher是用来进行uri匹配的辅助类,在静态代码块中为其初始化,添加了两条待匹配的uri。第三个参数是匹配成功时返回的编码,STUDENT表示对单条记录进行操作,STUDENTS表示对多条记录进行操作。

得到数据库->匹配uri->根据匹配得到的编码,执行相应的处理(单条记录需要用到ContentUris取出id部分)

在客户端访问ContentProvider时的代码:


先获得Resolver然后准备参数,最后执行

5.      网络

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值