android删除外置存储文件 中文件存储以及几种操作模式

在Android开发中,数据的持久化是肯定会用到,而持久化的方法大致有五种,分别是文件存储、网络存储、SharedPreferences、Sqlit数据库存储和ContentProvider。这五种存储方式各有各的优点,下面我将一一对它们进行介绍。

ContentProvider属于Android四大组件之一。从名字上来翻译的话,叫做内容提供者。它的作用主要是用来与其他应用进行数据交互的。举个列子来说,在QQ中拥有一个日程的入口,进入后我们可以在日历上标注某个日子的备注,用来提醒自己。然后我们打开系统的日历,发现刚才在qq中添加的备注,日历上也得到了显示。其实在这里就可以使用ContentProvider来完成。
所以就如同上面所说,如果我们希望得到其他应用的一些私密数据,而且其他应用愿意给我们提供这些数据的话,我们就可以使用ContentProvider这个组件来完成这个功能。
那么ContentProvider与sqlit有什么关系呢?其实ContentProvider只是用来提供内容或者修改内容的接口。而具体如何去获取数据、去哪里获取数据我们还是需要依靠其他的数据获取的方式。在ContentProvider内部,我们可以通过网络去得到当前应用的用户资料,可以通过SharedPreferences得到当前应用的配置,也可以通过文件来得到某些资源。所以它当然也可以通过Sqlit来操作底层的数据库。
因此我想将ContentProvider与sqlit数据库一起来讲,方便大家理解与使用。

}

下面详细讲解这五种方式的特点

    适用范围保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口 令密码等

//步骤2:获取文件中的值

SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

第二种: 文件存储数据

 除此之外,Context还提供了如下几个重要的方法:

实际案例:界面沿用上图

// 步骤1:获取输入值 // 步骤3:将获取过来的值放入文件 // 步骤4:关闭数据流

 下面讲解某些特殊文件读写需要注意的地方:

其中读写步骤按如下进行:

注意点:手机应该已插入SD卡,对于模拟器而言,可通过mksdcard命令来创建虚拟存储卡

SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。现在的主流移动设备像Android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧

SQLiteDatabase类为我们提供了很多种方法,上面的代码中基本上囊括了大部分的数据库操作;对于添加、更新和删除来说,我们都可以使用

除了统一的形式之外,他们还有各自的操作方法:

以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age

同样有2种方式可以实现

下面来说说查询操作。查询操作相对于上面的几种操作要复杂些,因为我们经常要面对着各种各样的查询条件,所以系统也考虑到这种复杂性,为我们提供了较为丰富的查询形式:

上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集;

  • colums:表示要查询的列所有名称集
  • selection:表示WHERE之后的条件语句,可以使用占位符
  • groupBy:指定分组的列名
  • limit:指定分页参数
  • distinct:指定“true”或“false”表示要不要过滤重复值

最后,他们同时返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。下面是Cursor对象的常用方法:

 

通过rawQuery实现的带参数查询

在上面的代码示例中,已经用到了这几个常用方法中的一些,关于更多的信息,大家可以参考官方文档中的说明。

最后当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。

上面就是SQLite的基本应用,但在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。

这里直接使用案例讲解:下面是案例demo的界面

factory:游标工厂,默认为null,即为使用默认工厂;

创建或打开一个只读数据库
创建或打开一个读写数据库
8 // 步骤1:设置常数参量 13 // 步骤2:重载构造方法 31 // 步骤3:数据库表的创建 35 //步骤4:使用参数db,创建对象

正如上面所述,数据库第一次创建时onCreate方法会被调用,我们可以执行创建表的语句,当系统发现版本变化之后,会调用onUpgrade方法,我们可以执行修改表结构等语句。

 我们需要一个Dao,来封装我们所有的业务方法,代码如下:

24 // 始终让cursor指向数据库表的第1行记录 28 // 循环游标,如果不是最后一项记录

我们在Dao构造方法中实例化sqliteDBHelper并获取一个SQLiteDatabase对象,作为整个应用的数据库实例;在增删改信息时,我们采用了事务处理,确保数据完整性;最后要注意释放数据库资源db.close(),这一个步骤在我们整个应用关闭时执行,这个环节容易被忘记,所以朋友们要注意。

我们获取数据库实例时使用了getWritableDatabase()方法,也许朋友们会有疑问,在getWritableDatabase()和getReadableDatabase()中,你为什么选择前者作为整个应用的数据库实例呢?在这里我想和大家着重分析一下这一点。

3 // 如果发现mDatabase不为空并且已经打开则直接返回 8 // 如果正在初始化则抛出异常 23 // 如果无法以可读写模式打开数据库 则以只读方式打开 29 // 以只读方式打开数据库

在getReadableDatabase()方法中,首先判断是否已存在数据库实例并且是打开状态,如果是,则直接返回该实例,否则试图获取一个可读写模式的数据库实例,如果遇到磁盘空间已满等情况获取失败的话,再以只读模式打开数据库,获取数据库实例并返回,然后为mDatabase赋值为最新打开的数据库实例。既然有可能调用到getWritableDatabase()方法,我们就要看一下了:

// 如果mDatabase不为空已打开并且不是只读模式 则返回该实例 // 如果mDatabase不为空则加锁 阻止其他的操作 // 打开或创建数据库 // 获取数据库版本(如果刚创建的数据库,版本为0) // 打开失败的情况:解锁、关闭

大家可以看到,几个关键步骤是,首先判断mDatabase如果不为空已打开并不是只读模式则直接返回,否则如果mDatabase不为空则加锁,然后开始打开或创建数据库,比较版本,根据版本号来调用相应的方法,为数据库设置新版本号,最后释放旧的不为空的mDatabase并解锁,把新打开的数据库实例赋予mDatabase,并返回最新实例。

看完上面的过程之后,大家或许就清楚了许多,如果不是在遇到磁盘空间已满等情况,getReadableDatabase()一般都会返回和getWritableDatabase()一样的数据库实例,所以我们在DBManager构造方法中使用getWritableDatabase()获取整个应用所使用的数据库实例是可行的。当然如果你真的担心这种情况会发生,那么你可以先用getWritableDatabase()获取数据实例,如果遇到异常,再试图用getReadableDatabase()获取实例,当然这个时候你获取的实例只能读不能写了

最后,让我们看一下如何使用这些数据操作方法来显示数据,界面核心逻辑代码:

Android SDK的tools目录下提供了一个sqlite3.exe工具,这是一个简单的sqlite数据库管理工具。开发者可以方便的使用其对sqlite数据库进行命令行的操作。

程序运行生成的*.db文件一般位于"/data/data/项目名(包括所处包名)/databases/*.db",因此要对数据库文件进行操作需要先找到数据库文件:

#ls --列出现寸的数据库文件

至此,可对数据库进行sql操作。

}

在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上 Android 为数据存储提供了如下几种方式:

SharedPreferences是以键值对来存储应用程序的配置信息的一种方式,它只能存储基本数据类型。一个程序的配置文件仅可以在本应用程序中使用,或者说只能在同一个包内使用,不能在不同的包之间使用。实际上sharedPreferences是采用了XML格式将数据存储到设备中,在DDMS 中的File Explorer中的/data/data//shares_prefs下。

下面我们以一个例子来说明如何使用sharedpreferences来存储数据,该例子是在Activity退出时保存界面的基本的信息,当再次运行该程序的时候,就会读取上次保存的信息。【界面中有一个账号EditText,密码 EditText和一个记住密码的CheckBox,输入账号和密码,如果选中记住密码复选框,下次打开程序时,则会显示账号和密码;如果没有选中记住密码复选框,下次打开程序时,则只是显示账号。】

以上的程序是通过创建一个 userinfo.xml 文件来存储用户退出时保存用户的一些基本信息。当再次打开程序时,是通过读取该文件来获取之前的信息。

(4) 通过SharedPreferences.Editor接口的commit方法保存key-value对。Commit方法相当于数据库事务中的提交(commit)操作。只有在事件结束后进行提交,才会将数据真正保存在数据库中。保存key-value也是一样。

}

我要回帖

更多关于 android删除外置存储文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信