一、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、


同: 都可以获取一个用于操作数据库的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存储数据:安卓四大组件之一


五、网络存储数据