安卓数据存储困惑

一、Android中的数据库
1、 使用SQLiteOpenHelper对数据库进行版本管理
   在android系统中,为我们提供了一个名为SqLiteOpenHelper的抽象类,必须继承它才可以使用。
   为了实现数据库的版本管理,Sqliteopenhelper类提供了二个重要方法
oncreate:用于初次使用软件时生成数据库表
onUpgrade:用于升级软件时更新数据库表结构

当调用SqliteOpenHelper的getWritAbleDatabase或者getReadableDatabse方法获取操作数据库的SqliteDatabase实例时候,如果数据库不存在,安卓系统会自动生成一个数据库,接着调用oncreate方法,oncreate方法在初次生成数据库时才会被调用

在oncreate方法中,创建表,初始化数据。
在onUpgrade方法中,数据库版本发生变化时会被调用,一般软件升级时才需要修改版本号。

注意:发现好多博客文章,只是说明在数据库升级时,把需要改变的表结构操作放在 onUpgrade中,个人感觉这种说法有些错误。
查看源码可以发现:
  try {
                    if (version == 0) {
                        onCreate(db);
                    } else {
                        if (version > mNewVersion) {
                            onDowngrade(db, version, mNewVersion);
                        } else {
                            onUpgrade(db, version, mNewVersion);
                        }
                    }
                    db.setVersion( mNewVersion);
                    db.setTransactionSuccessful();
                } finally {
                    db. endTransaction();
                }

只有在首次创建数据库时才走, onCreate方法,但是不走 onUpgrade方法。作为新安装的客户端的app来说,在 onUpgrade做的升级改变数据表的的代码是不走的。所有个人认为,在sqlite数据库版本升级时,需要升级的部分也需要在 onCreate方法中调用。这样既可兼容之前版本的升级,也可以使新的版本包含升级的内容。
2、 getWritableDatabase()和 getReadableDatabase()区别
同: 都可以获取一个用于操作数据库的SQLiteDatabase实例
异:getWritableDatabase打开读写数据库,一旦数据库内存不足,只能打开只能读不能写的数据库, 倘若使用getWritableDatabase()打开数据库就会出错。
       getReadableDatabase 方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

注意:getWritableDatabase(),getReadableDatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,所以如果不是更新数据库的话,最好调用后者来获得数据库连接。
3、数据库的 CRUD相信大家已经很熟悉了,这里就不详细描述
二、 SharedPreferences
    与Sqlite数据库相比,免去创建数据库表,写sql的众多操作,相对操作方便,但是缺陷,只能存储boolean,int,float,long和String,五种简单数据类型,不能条件查询。
     SharedPreferences接口主要负责读取应用程序的Preferences数据,它提供了如下常用方法来访问SharedPreferences的key_value键值对。
1、 SharedPreferences常用的属性和方法
contains  判断 SharedPreferences是否包含特定的key
edit            返回一个Edit对象用于操作SharedPreferences
getAll        获取SharedPreferences数据里全部的key-valu
getXXX(String key,XXX defvlaue)   获取SharedPreferences数据指定key所对应的value,如果该key不存在,返回默认值defValue。其中XXX可以是boolean、float、int、long、String等基本类型的值

SharedPreferences是一个接口,在接口里没有提供写入数据的能力。但是内部有个editor内部的接口,edit这个接口有一系列的方法用于操作sharepreference。
2、Editor接口的常用方法
clear  清空SharedPreferences里所有的数据
commit   当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改
putXXX (String key, boolean XXX)   向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值
remove (String key)   删除SharedPreferences里指定key对应的数据项
3、SharedPreferences实例化

SharedPreferences是一个接口,程序是无法创建SharedPreferences实例的,可以通过Context.getSharedPreferences(String name,int mode)来得到一个SharedPreferences实例

name:是指文件名称,不需要加后缀.xml,系统会自动为我们添加上。一般这个文件存储在/data/data/<package name>/shared_prefs下(这个面试常问到)

mode:是指定读写方式,其值有三种,分别为:

Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写

Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写

Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。


三、文件存储
(1)内部存储(手机存储)
原理:提供二个方法打开数据文件里的文件IO流
FileInputStream openFileInput(String name);  用于指定文件名  
FileOutputStream(String name , int mode)   第二个参数指定打开文件的模式  
打开文件模式:
MODE_PRIVATE:默认模式,代表该文件私有数据,在改模式下,写入的内容会覆盖原文件内容。
MODE_APPEND:该模式会检测文件是否存在,存在就追加内容,否则就创建新的文件。
MODE_WORLD_READABLE:可以被其他应用读取。
MODE_WORLD_WRITEABLE:可以被其他应用写入

其他方法:
getDir(String name , int mode):在应用程序的数据文件夹下获取或者创建name对应的子目录
File getFilesDir():获取该应用程序的数据文件夹得绝对路径
String[] fileList():返回该应用数据文件夹的全部文件         


openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.tony.app/files/message.txt
(2)外部存储(sd卡存储)
存储目录为sd卡下的目录
四、使用ContentProvider存储数据:安卓四大组件之一
五、网络存储数据

猜你喜欢

转载自blog.csdn.net/u011638706/article/details/51479509