




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
middleware technology and application Android四种存储储方式 宁夏大学数学计算机学院 二零一五年 作为一个完整的应用程序,数据存储操作是必不可 少的。Android系统一共提供了四种数据存储方式 。分别是:SharePreference、SQLite、Content Provider和File。 由于Android系统中,数据基本都是私有的的,都是 存放于“data/data/程序包名”目录下,所以要实现 数据共享,正确方式是使用Content Provider。 Android四种存储储方式 middleware technology and application 一、File存储储方式 File:即常说的文件(I/O)存储方法,常用存储大 数量的数据,但是缺点是更新数据将是一件困难的 事情。 下面实现 :在本地data文件下使用自己生成的文件 处理数据的新建储存、读取、删除。 File基本概念 1.保存文件内容:通过Context.openFileOutput获取输出流 ,参数分别为文件名和存储模式。 2.读取文件内容:通过Context.openFileInput获取输入流 ,参数为文件名。 3.删除文件:Context.deleteFile删除指定的文件,参数为 将要删除的文件的名称。 4.获取文件名列表:通过Context.fileList获取files目录下 的所有文件名数组。 *获取文件路径的方法: 绝对路径:/data/data/files/filename Context:Context.getFilesDir()可以获取到“/data/data/files“ File方式实现实现 的基本操作 1.Context.MODE_PRIVATE 为默认操作模式,代表该文件 是私有数据,只能被应用本身访问,在该模式下写入 的内容会覆盖原文件的内容。 2.Context.MODE_APPEND 检查文件是否存在,存在就往文 件追加内容,否则就创建新文件。 3.MODE_WORLD_READABLE 表示当前文件可以被其他应用 读取。 4.MODE_WORLD_WRITEABLE 表示当前文件可以被其他应 用写入。 在使用模式时,可以用“+”来选择 多种模式,如 :openFileOutput(FILENAME, Context.MODE_PRIVATE + MODE_WORLD_READABLE); 四种文件保存的模式。 private void write() String nameage=“名字:”+name.getText().toString().trim()+“年龄: “+age.getText().toString(); try os = this.openFileOutput(SHARED_MAIN_XML, MODE_PRIVATE); /* 把字符串转换成字节数组,写入文件中 */ os.write(nameage.getBytes(); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); finally try /* 关闭文件输出流 */ os.close(); catch (IOException e) e.printStackTrace(); 写: private String read() String nameage=“ “; / 打开文件输入流, try is = this.openFileInput(SHARED_MAIN_XML);/* 初始化字节数组 */ b = new byte1024; /* 从文件输入流中读取内容到字节数组中,返回内容长度 */ int length = is.read(b); /* 把字节数组转换 成字符串 */ nameage= new String(b); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); return nameage; 读: middleware technology and application 二、SQLite存储储方式 SQLite基本概念 SQLite是一个轻量级的数据库,支持基本SQL语法 ,是常被采用的一种数据存储方式。 Android为此数据库提供了一个名为SQLiteDatabase 的类,封装了一些操作数据库的API。 SQLite是一种转为 嵌入式设备设计 的轻型数据库 ,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中,并没有专门设计 BOOLEAN和DATE类型,因为 BOOLEAN型可以用INTEGER的0和1代替true和false,而DATE类型 则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显示 ,为了能方便的操作DATE类型,SQLite提供了一组函数,详见 :/lang_datefunc.html。 关于SQLite 在Android系统中提供了android.database.sqlite包, 用于进行SQLite数据库的增、删、改、查工作。其 主要方法如下: beginTransaction(): 开始一个事务。 close(): 关闭连 接,释放资源。 endTransaction(): 结束一个事务。 execSQL(String sql): 执行给定SQL语句。 delete(String table, String whereClause, String whereArgs):根据给定条件,删除符合条件的记录 。 SQLite中的 API insert(String table, String nullColumnHack, ContentValues values): 根据给定条件,插入一条 记录 。 openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory): 根据给定条 件连接数据库,如果此数据库不存在,则创 建。 query(String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy): 执行查询 。 SQLite中的 API rawQuery(String sql, String selectionArgs):根据给定 SQL,执行查询 。 update(String table, ContentValues values, String whereClause, String whereArgs): 根据给定条件,修 改符合条件的记录 。 除了上诉主要方法外,Android还提供了诸多实用 的方法,总之一句话:其实Android访问 数据库是 一件很方便的事儿。 SQLite中的 API 封装一个类去继承SQLiteOpenHelper 在构造函数中 传入数据库名称与数据库版本号。 数据库被创建的时候会调用 onCreate(SQLiteDatabase db) 方法。 数据库版本号发生改变的时候会调用 onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion)方法。 创创建与删删除数据库库 调用SQLiteOpenHelper 的getReadableDatabase()方 法去创建数据库,如果数据库不存在则创 建并且 返回SQLiteDatabase对象,如果数据库存在则不创 建只返回SQLiteDatabase对象。 调用 deleteDatabase(DATABASE_NAME)方法 传入数 据库名称则可删除数据库。 创创建与删删除数据库库 public class UserService private DatabaseHelper helper; public UserService(Context context, String name, int version) helper = new DatabaseHelper(context, name, version); public UserService(Context context, String name) helper = new DatabaseHelper(context, name); 下面是个简单简单 的例子,用来实现实现 增删删改 : 插入数据 public void insert(UserDao user) / 插入数据 SQLiteDatabase sdb = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(“username“, user.getUsername(); values.put(“password“, user.getPassword(); sdb.insert(“user“, “name“, values); sdb.close(); public void delete(int id) / 删除数据 SQLiteDatabase sdb = helper.getWritableDatabase(); sdb.delete(“user“, “id=?“, new StringString.valueOf(i d); sdb.close(); 删删除数据 public void update(UserDao user, int id) / 更新数据 SQLiteDatabase sdb = helper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put(“username“, user.getUsername(); values.put(“password“, user.getPassword(); sdb.update(“user“, values, “id=?“, new StringString.value Of(id); sdb.close(); 更新数据 public Cursor select() / 查询 所有数据 SQLiteDatabase sdb = helper.getWritableDatabase() ; return sdb.query(“user“, new String“id as _id“,“ username“,“password“, null, null, null, null, null); 查询 所有数据 public UserDao find(int id)/按id查询 数据 UserDao user=null; SQLiteDatabase sdb=helper.getWritableDatabase(); Cursor cursor=sdb.query(“user“, new String“id“,“username“,“passw ord“, “id=?“, new StringString.valueOf(id), null, null, null); if(cursor.moveToFirst() user=new UserDao(); user.setId(cursor.getInt(0); user.setUsername(cursor.getString(1); user.setPassword(cursor.getString(2); cursor.close(); sdb.close(); return user; 按id查询 数据 插入数据:通过insert(String table, StringnullColumnHack, ContentValues values)方法插 入数据,其中参数含义分别为 : table: 目标表名 nullColumnHack: 指定表中的某列列名。因为在 SQLite中,不允许不允许插入所有列均为null的记 录,因此初始值有值为 空时,此列需显式赋予null values:ContentValues对象,类似于java中的Map。 以键值对 的方式保存数据。 插入数据: 修改数据: update(String table,ContentValues values, String whereClause, String whereArgs)方法用于修改数据, 其四个参数的具体含义如下: table: 目标表名 values: 要被修改成为的新值 whereClause:where子句,除去where关键字剩下的部分, 其中可带?占位符。如没有子句,则为null。 whereArgs: 用于替代whereClause参数中?占位符的参数。 如不需传入参数,则为null。 修改数据: 查询数据:query()方法用SELECT 语句段构建查询。 SELECT 语句内容作为 query() 方法的参数,比如:要查询 的表名,要获取的字段名,WHERE 条件,包含可选的位 置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。 除了表名,其他参数可以是 null。所以,以前的代码段可 以可写成: String columns=“ID“,“inventory“; String parms=“snicklefritz“; Cursor result=db.query(“widgets“,columns, “name=?“,parms, null, null, null); 查询查询 数据: 不管你如何执行查询 ,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以: 通过使用 getCount() 方法得到结果集中有多少记录 ; 通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法 遍历所有记录 ; 通过 getColumnNames() 得到字段名; 通过 getColumnIndex() 转换 成字段号; 通过 getString(),getInt() 等方法得到给定字段当前记 录的值; 通过 requery() 方法重新执行查询 得到游标; 通过 close() 方法释放游标资 源; 使用游标标 删除数据:删除数据也是一件很简单 的事,只需 要调用delete方法,传入参数即可,delete(String table, String whereClause,String whereArgs)的参数 三个参数具体含义如下: table: 目标表名 whereClause:where子句,除去where关键字剩下的 部分,其中可带?占位符。如没有子句,则为 null 。 whereArgs: 用于替代whereClause参数中?占位符的 参数。如不需传入参数,则为 null。 删删除数据: middleware technology and application 三、 SharedPreferences 存储储方式 SharedPreferences是一种轻型的数据存储方式,它 的本质是基于XML文件存储key-value键值对 数据 ,通常用来存储一些简单 的配置信息。 其存储位置在/data/data/shared_prefs目录 下。SharedPreferences对象本身只能获取数据而不 支持存储和修改,存储修改是通过Editor对象实现 。 SharedPreferences基本概念 一、根据Context获取SharedPreferences对象 二、利用edit()方法获取Editor对象。 三、通过Editor对象存储key-value键值对 数据。 四、通过commit()方法提交数据。 具体实现 代码如下:实现 存储,读取,清除,删除 实现实现 SharedPreferences存储储步骤骤如下: private void write() / 存入数据 savename = name.getText().toString().trim(); saveage = Integer.valueOf(age.getText().toString().trim(); Editor editor = mShared.edit(); editor.putString(“name“, savename); editor.putInt(“age“, saveage); / 保证操作的事务完整性 mit(); 存储: private String read() / 从数据库里读取数据 namecontent = mShared.getString(“name“, “数据库 里没有存储姓名“); agecontent = mShared.getInt(“age“, 0); String reading = “姓名:“ + namecontent + “n年龄 :“ + agecontent; return reading; 读取: private void clear() /清除内容 /* 开始清除SharedPreferences中保存的内容 */ Editor editor = mShared.edit(); editor.remove(“name“); editor.remove(“age“); mit(); 清除: private void delete() /删除文件 /* 删除SharedPreferences文件 */ Filefile = new File(“/data/data/cn.csdn.activity“ + “/ shared_prefs/“ + SHARED_MAIN_XML + “.xml“); if (file.exists() file.delete(); Toast.makeText(this, “删除成功 “, Toast.LENGTH_LONG).show(); 删除: sharedPreferences对象与SQLite数据库相比,免去了创建 数据库,创建表,写SQL语句等诸多操作,相对而言更加 方便,简洁。 但是SharedPreferences也有其自身缺陷,比如其职能存储 boolean,int,float,long和String五种简单的数据类型, 比如其无法进行条件查询等。 所以不论SharedPreferences的数据存储操作是如何简单, 它也只能是存储方式的一种补充,而无法完全替代如 SQLite数据库这样 的其他数据存储方式。 小结结 middleware technology and application 四、 Content Provider存 储储方式 Content Provider主要内容 1.Content Provider基本概念 1.Uri 1.ContentProvider的实现 方法 Content Provider基本概念 1.Content Provider提供为存储和截取数据提供了统一的接口 2.每个Content Provider都会对外提供一个公共的URI(包装成 Uri对象),如果应用程序有数据需要共享时,就需要使用 Content Provider为这 些数据定义一个URI,然后其他的应用 程序就通过Content Provider传入这个URI来对数据进行操作 。 3.Android为常见的一些数据提供了Content Provider(包括音频 ,视频 ,图片和通讯录 等等) Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分: A:无法改变的标准前缀,包括;“content:/“、“tel:/“等。当前缀是 “content:/“时,说明通过一个Content Provider控制这些数据 B:URI的标识 ,它通过authorities属性声明,用于定义了是哪个 ContentProvider提供这些数据。对于第三方应用程序,为了保证URI 标识 的唯一性,它必须是一个完整的、小写的类名。例如: “content:/com.test.data.myprovider“ C:路径,可以近似的理解为需要操作的数据库中表的名字,如: “content:/hx.android.text.myprovider/name“中的name D:如果URI中包含表示需要获取的记录 的ID;则就返回该id对应 的 数据,如果没有ID,就表示返回全部; URI说说明 ContentProvider是安卓平台中,在不同应用程序之间 实现 数据共享的一种机制。一个应用程序如果需要让 别的程序可以操作自己的数据,即可采用这种机制。 并且此种方式忽略了底层的数据存储实现 , ContentProvider提供了一种统一的通过Uri实现 数据操 作的方式。其步骤为 : 实现实现 Content Provider的过过程 1. 在当前应用程序中定义一个ContentProvider。 2. 在当前应用程序的AndroidManifest.xml中注册此 ContentProvider 3. 其他应用程序通过ContentResolver和Uri来获取此 ContentProvider的数据。 ContentResolver提供了诸如insert(), delete(), query()和update()之类 的方法。用于实现对 ContentProvider中数据的存取操作。 其步骤为骤为 : 首先创建继承contentprovider的类。 public class UserContentProvider extends ContentProvider private DatabaseHelper helper; private SQLiteDatabase db; private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int USERS = 1; private static final int USER = 2; static matcher.addURI(“viders.userprovider“, “user“, USERS); matcher.addURI(“viders.userprovider“, “user/#“, USER); 下面是实现实现 代码码: public int delete(Uri uri, String selection, StringselectionArgs) db=helper.getWritableDatabase(); int num=0; switch(matcher.match(uri) case USERS: num=db.delete(“user“, selection, selectionArgs); break; case USER: long id=ContentUris.parseId(uri); String where=“id=“+id; if(selection!=null num=db.delete(“user“, where, selectionArgs); break; default: throw new IllegalArgumentException(“Unknown Uri:“+ uri); return num; 实现实现 delete方法: public String getType(Uri uri) switch(matcher.match(uri) case USERS: return “vnd.android.cursor.dir/person“; case USER: return “vnd.android.cursor.item/person“; default: throw new IllegalArgumentException(“Unknown Uri:“+ uri); 实现实现 getType方法: public Uri insert(Uri uri, ContentValues values) db=helper.getWritableDatabase(); long rowid; switch(matcher.match(uri) case USERS: /向表中添加新纪录 并返回其行号 rowid=db.insert(“user“, “id“, values); return ContentUris.withAppendedId(uri, rowid); default: throw new IllegalArgumentException(“Unknow Uri:“ + uri); 实现实现 Insert方法: public boolean onCreate() helper=new DatabaseHelper(this.getContext(),“users. db“); return true; 实现实现 OnCreate方法: public Cursor query(Uri uri, String projection, Stringselection, String selectionArgs, String sortOrder) db = helper.getReadableDatabase(); switch(matcher.match(uri) case USERS: return db.query(“user“, projection, selection, selectionArgs, null, null, sortOrder); case USER: long id=ContentUris.parseId(uri); String where=“id=“+id; if(selection!=null return db.query(“user“, projection, where, selectionArgs, null, null, sortOrder); default: throw new IllegalArgumentException(“Unknown Uri:“+ uri); 实现实现 query方法: public int update(Uri uri, ContentValues values, String selection, String selectionArgs) db=helper.getWritableDatabase(); int num; switch(matcher.match(uri) case USERS: num=db.update(“user“, values, selection, selectionArgs); break; case USER: long id=ContentUris.parseId(uri); String where=“id=“+id; if(selection!=null num=db.update(“user“, values, selection, selectionArgs); break; default: throw new IllegalArgumentException(“Unknow Uri“+uri); return num; 实现实现 update方法: 需要在中为provider进行 注册! provider android:authorities=“vider s.userprovider“ android:name=“UserContentProvider“ 配置manifest.xml /contentprovider测试 public void te
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供热公司供暖管理制度
- 供电操作培训管理制度
- 促销物料使用管理制度
- 保利地产人员管理制度
- 保安行业服装管理制度
- 保密检查动态管理制度
- 保洁公司后续管理制度
- 保洁公司规范管理制度
- 保洁工具领用管理制度
- 保洁风险防范管理制度
- 土地延期合同范本
- 1.4行列式的性质
- GB/T 4706.19-2024家用和类似用途电器的安全第19部分:液体加热器的特殊要求
- 12D401-3 爆炸危险环境电气线路和电气设备安装
- 跟着音乐去旅行智慧树知到期末考试答案章节答案2024年浙江旅游职业学院
- 老年外科患者围手术期营养支持中国专家共识(2024版)
- 企业员工保密协议书范本
- 2023年6月上海高考英语卷试题真题答案解析(含作文范文+听力原文)
- 征集和招录人员政治考核表
- 生态环境保护与可持续发展智慧树知到期末考试答案章节答案2024年浙江农林大学
- MH-T 5003-2016 民用运输机场航站楼离港系统工程设计规范
评论
0/150
提交评论