Android数据存储总结资料.docx
- 文档编号:10327599
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:14
- 大小:125.62KB
Android数据存储总结资料.docx
《Android数据存储总结资料.docx》由会员分享,可在线阅读,更多相关《Android数据存储总结资料.docx(14页珍藏版)》请在冰豆网上搜索。
Android数据存储总结资料
Android数据存储
1)Preference
SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
其存储位置在/data/data/<包名>/shared_prefs目录下(可以通过Eclipse下的FileExplorer查看创建的问题)。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。
SharedPreferences支持三种访问模式
私有(MODE_PRIVATE):
仅有创建程序有权限对其进行读取或写入
全局读(MODE_WORLD_READABLE):
表示当前文件可以被其他应用读取
全局写(MODE_WORLD_WRITEABLE):
表示当前文件可以被其他应用写入
实现步骤如下:
一、根据Activity类的方法获取SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定,第二个参数指定文件的操作模式。
二、使用SharedPreferences接口的edit()方法获取Editor对象。
三、通过Editor对象接口的putXxx和GetXxx方法存取key-value键值对数据。
四、通过commit()方法提交数据。
例:
SharedPreferencessp=getSharedPreferences(PREF_FILE,MODE);
Editoreditor=sp.edit();
editor.putString("Name",str1);
editor.putString("Number",str2);
mit();//提交修改
//获取数据
StringName=sp.getString("Name","NULL");
//清除数据
editor.clear();//清除所有值
editor.remove("Number");//清除某一项
//配置变更监听器
当多个应用共享配置时,可以添加配置变更监听器,监听配置是否发生变化
sp.registerOnSharedPreferenceChangeListener(newSharedPreferences.OnSharedPreferenceChangeListener(){
@Override
publicvoidonSharedPreferenceChanged(SharedPreferencessharedPreferences,Stringkey){
System.out.println("onSharedPreferenceChanged");
}
});
SharedPreferences对象与SQLite数据库相比:
优点:
免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。
缺点:
只能存储boolean,int,float,long和String五种简单的数据类型;无法进行条件查询等。
2)File
Android使用的是基于Linux的文件系统,程序开发人员可以建立和访问程序自身的私有文件,也可以访问保存在资源目录中的原始文件和XML文件,还可以在SD卡等外部存储设备中保存文件。
也支持标准Java的IO类和方法。
读写数据两种方式:
方式一:
Android系统允许应用程序创建仅能够自身访问的私有文件,文件保存在设备的内部存储器上,文件存储在系统下的/data/data/
主要接口:
FileInputStreamfis=openFileInput(filename);//读取数据
FileOutputStreamfos=openFileOutput(filename);//写入数据
Android系统支持四种文件操作模式
模式
说明
MODE_PRIVATE
私有模式,缺陷模式,文件仅能够被文件创建程序访问,或具有相同UID的程序访问。
MODE_APPEND
追加模式,如果文件已经存在,则在文件的结尾处添加新数据。
MODE_WORLD_READABLE
全局读模式,允许任何程序读取私有文件。
MODE_WORLD_WRITEABLE
全局写模式,允许任何程序写入私有文件。
//写数据
StringFILE_NAME="fileDemo.txt";
FileOutputStreamfos=openFileOutput(FILE_NAME,Context.MODE_PRIVATE)
Stringtext=“Somedata”;
fos.write(text.getBytes());
fos.flush();
fos.close();
//读数据
FileInputStreamfis=openFileInput(FILE_NAME);
byte[]readBytes=newbyte[fis.available()];
fis.read(readBytes);
//删除文件
deleteFile(FILE_NAME);
方式二:
FileOutputStreamfos=newFileOutputStream(file绝对路径);
FileInputStreamfos=newFileInputStream(file绝对路径);
例SD读写操作:
首先需要检测系统的/sdcard目录是否可用;
如果不可用,则说明设备中的SD卡已经被移除,在Android模拟器则表明SD卡映像没有被正确加载;
如果可用,则直接通过使用标准的Java.io.File类进行访问;
Filedir=newFile(SD_CARD);
if(dir.exists()&&dir.canWrite()){
FilenewFile=newFile(dir.getAbsolutePath()+"/"+FILE_NAME);
FileOutputStreamfos=null;
try{
newFile.createNewFile();
if(newFile.exists()&&newFile.canWrite()){
fos=newFileOutputStream(newFile);
fos.write(content.getBytes());
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(fos!
=null){
try{
fos.flush();
fos.close();
}
catch(IOExceptione){}
}
}
}
注:
对SD卡访问需添加:
--在SDCard中创建与删除文件权限-->
name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> --往SDCard写入数据权限--> name="android.permission.WRITE_EXTERNAL_STORAGE"/> 模拟器SD卡镜像: 1.创建SDcard镜像文件 mksdcard[-llabel] -llabel为SD卡创建一个卷标,可选项; 例: mksdcard1024Msdcard.img 2.关联sdcard和模拟器 I.通过AVDManager,编辑虚拟机的SDCard关联选择,选中相关的镜像文件; 硬件配置需选择支持SDCardsupport II. emulator.exe-avd模拟器名称-sdcardsd卡镜像的绝对或者相对路径 emulator.exe-avd2.2-sdcard../sdcard/sdcard.img 3.将文件拷贝到sdcard上 adbpush 例: adbpushfoo.txtsdcard/ adbpushE: \test.3gpsdcard/test.3gp 4.安装其他apk adbinstall***.apk 5.拟器中使用SD卡文件 Devtools里面Mediascannerscan一下媒体文件 3)Sqlite Adnroid中通过SQLite数据库引擎来实现结构化数据存储。 SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备提供的一种高效的数据库引擎。 支持基本SQL语法,是常被采用的一种数据存储方式。 主要特点: 轻量级 SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。 使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。 而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB。 不需要"安装" SQLite的核心引擎本身不依赖第三方的软件,使用它也不需要"安装"。 有点类似那种绿色软件。 单一文件 数据库中所有的信息(比如表、视图等)都包含在一个文件内。 这个文件可以自由复制到其它目录或其它机器上。 跨平台/可移植性 除了主流操作系统windows,linux之后,SQLite还支持其它一些不常用的操作系统。 弱类型的字段 同一列中的数据可以是不同类型 操作模型: SQLite数据库采用了模块化设计,由8个独立的模块构成,这些独立模块又构成了三个主要的子系统,模块将复杂的查询过程分解为细小的工作进行处理。 Ø接口由SQLiteCAPI组成,因此无论是应用程序、脚本,还是库文件,最终都是通过接口与SQLite交互 Ø编译器 ✓由分词器和分析器组成 ✓分词器和分析器对SQL语句进行语法检查,然后把SQL语句转化为底层能更方便处理的分层的数据结构,这种分层的数据结构称为“语法树” ✓把语法树传给代码生成器进行处理,生成一种针对SQLite的汇编代码最后由虚拟机执行 Ø虚拟机 ✓SQLite数据库体系结构中最核心的部分是虚拟机,也称为虚拟数据库引擎(VirtualDatabaseEngine,VDBE) ✓与Java虚拟机相似,虚拟数据库引擎用来解释执行字节代码 ✓虚拟数据库引擎的字节代码由128个操作码构成,这些操作码主要用以对数据库进行操作,每一条指令都可以完成特定的数据库操作,或以特定的方式处理栈的内容 Ø后端 ✓后端由B-树、页缓存和操作系统接口构成 ✓B-树的主要功能就是索引,它维护着各个页面之间的复杂的关系,便于快速找到所需数据 ✓页缓存的主要作用就是通过操作系统接口在B-树和磁盘之间传递页面 ✓B-树和页缓存共同对数据进行管理 SQLite支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象,大数据)数据类型. 虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。 例如: 可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外: 定义为INTEGERPRIMARYKEY的字段只能存储64位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。 另外,SQLite在解析CREATETABLE语句时,会忽略CREATETABLE语句中跟在字段名后面的数据类型信息。 数据库都保存在各自的/data/data/ 通过SQL语句创建数据库: 创建表: CREATETABLEperson(personidintegerprimarykeyautoincrement,namevarchar(20)) 查询语句: select*from表名where条件子句groupby分组字句having...orderby排序子句 如: select*fromperson select*frompersonorderbyiddesc selectnamefrompersongroupbynamehavingcount(*)>1 分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录 select*fromAccountlimit5offset3或者select*fromAccountlimit3,5 插入语句: insertinto表名(字段列表)values(值列表)。 如: insertintoperson(name,age)values(‘传智’,3) 更新语句: update表名set字段名=值where条件子句。 如: updatepersonsetname=‘传智‘whereid=10 删除语句: deletefrom表名where条件子句。 如: deletefrompersonwhereid=10 SQLITE_MASTER表: SQLite数据库的对象信息(表、视图、序列、索引等等)被保存在一个名叫"sqlite_master"的特殊的表中。 你可以像查询其它表一样通过执行“SELECT”查询这个特殊的表。 例如: sqlite>select*fromsqlite_master; 但你不能在sqlite_master表中执行诸如DROPTABLE,UPDATE,INSERT或者DELETE命令。 sqlite_master表在你创建、删除和索引数据库时自动更新这个表。 你不能手工更改sqlite_master表。 TEMPORARY表的结构没有存储在"sqlite_master"表中,由于TEMPORARY表对应用是不可见的,而不是应用程序创建这个表。 TEMPORARY表结构被存储在另外一个名叫"sqlite_temp_master"的特定的表中。 "sqlite_temp_master"表是临时表自身。 通过adbshell进入手机系统 sqlite3people.db CREATETABLEpeopleinfo(_idintegerprimarykeyautoincrement,nametextnotnull,ageinteger,heightfloat);//创建表 insertintopeopleinfovalues(null,'Tom',21,1.81);//插入 deletefrompeopleinfowhere_id=2//删除 select*frompeopleinfo//查询 droptablepeopleinfo//删除数据表 .tables//查看数据表格是否创建成功; 通过Android提供的接口创建 Android提供了创建和使用数据库的相关API: SQLiteDatabase类: 代表数据库对象,提供了操作数据库的一些方法: 创建、插入,删除、修改、查询等; SQLiteDatabase的常用方法 方法 描述 publicstaticSQLiteDatabaseopenOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory) 用于打开或创建一个数据库(对于sqlite来说,就是打开或产生一个数据库文件), 参数中的File类就是java中表示系统文件路径的File类,而SQLiteDatabase.CursorFactory则是一个产生Cursor对象的工厂类 publiclonginsert(Stringtable,StringnullColumnHack,ContentValuesvalues) 用于在数据库中加入数据。 ContentValue类似于java中HashMap类,用于以键值对的方式保存数据 publicintdelete(Stringtable,StringwhereClause,String[]whereArgs) 删除表中的数据 publicCursorquery(booleandistinct,Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit) 查询数据库中的数据,返回查询结果集 publicintupdate(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs) 用于修改数据 publicvoidexecSQL(Stringsql) 执行String表示的非查询的SQL语句,例如Create等 publicvoidclose() 用来关闭数据库并释放数据库占用的相关资源 SQLiteOpenHelper类: 该类是SQLiteDatabase一个辅助类。 这个类主要生成一个数据库,并对数据库的版本进行管理。 当在程序当中调用这个类的方法getWritableDatabase()或者getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。 SQLiteOpenHelper是一个抽象类,我们通常需要继承它,并且实现里面的3个函数: 1.onCreate(SQLiteDatabase) 在数据库第一次生成的时候会调用这个方法。 2. onUpgrade(SQLiteDatabase,int,int) 当数据库需要升级的时候,Android系统会主动的调用这个方法。 3. onOpen(SQLiteDatabase): 这是当打开数据库时的回调函数,一般在程序中不是很常使用。 使用了帮助类SQLiteOpenHelper创建数据库,从而避免直接调用SQLiteDatabase中的打开和创建数据库的方法,简化了数据库打开过程中繁琐的逻辑判断过程。 例子参考数据SJCQAPP 补充: Context类: Context字面意思是上下文,它是一个抽象类。 位于frameworkpackage的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄。 很多方法需要通过Context才能识别调用者的实例。 Context提供了关于应用环境全局信息的接口,通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如: 启动Activity、Service服务、发送广播,接受Intent信息 ,读写文件等。 如: getSharedPreferences openFileInput/openFileOutput openOrCreateDatabase getContentResolver 其他方面的 getSystemService//ALARM_SERVICE/AUDIO_SERVICE//NOTIFICATION_SERVICE getResources getPackageManager Context类的继承关系: ContentValues类 ContentValues和HashTable类似都是一种存储的机制。 两者最大的区别就在于: contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西;HashTable却可以存储对象;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 数据 存储 总结 资料