Android4种存储方式介绍,一年后斩获腾讯T3

  1. editor.remove(“name”);

  2. editor.remove(“age”);

  3. editor.commit();

  4. }

删除:

  1. private void delete() {//删除文件

  2. /** 删除SharedPreferences文件 **/

  3. Filefile = new File(“/data/data/cn.csdn.activity” + “/shared_prefs/”

  4. + SHARED_MAIN_XML + “.xml”);

  5. if (file.exists()) {

  6. file.delete();

  7. Toast.makeText(this, “删除成功”, Toast.LENGTH_LONG).show();

  8. }

  9. }

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

2、File:即常说的文件(I/O)存储方法,常用存储大数量的数据,但是缺点是更新数据将是一件困难的事情。下面实现:在本地data文件下使用自己生成的文件处理数据的新建储存、读取、删除

如果说不想把内容存在SharedPreferences中的话,我们可以自己写一个文件保存须要的数据,在这里我将文件保存在系统中的工程路径下。跟上面一样,删除文件也一样,清除内容也查不多,下面只是简单的写和读的方法:

写文件:

  1. String nameage=“名字:”+name.getText().toString().trim()+“年龄:”+age.getText().toString();

  2. try {

  3. os = this.openFileOutput(SHARED_MAIN_XML, MODE_PRIVATE);

  4. /* 把字符串转换成字节数组,写入文件中 */

  5. os.write(nameage.getBytes());

  6. } catch (FileNotFoundException e) {

  7. e.printStackTrace();

  8. } catch (IOException e) {

  9. e.printStackTrace();

  10. }finally {

  11. try {

  12. /* 关闭文件输出流 */

  13. os.close();

  14. } catch (IOException e) {

  15. e.printStackTrace();

  16. }

  17. }

读:

  1. private String read() {

  2. String nameage=“”;

  3. // 打开文件输入流,

  4. try {

  5. is = this.openFileInput(SHARED_MAIN_XML);

  6. /* 初始化字节数组 */

  7. b = new byte[1024];

  8. /* 从文件输入流中读取内容到字节数组中,返回内容长度 */

  9. int length = is.read(b);

  10. /* 把字节数组转换成字符串 */

  11. nameage= new String(b);

  12. } catch (FileNotFoundException e) {

  13. e.printStackTrace();

  14. } catch (IOException e) {

  15. e.printStackTrace();

  16. }

  17. return nameage;

  18. }

3、SQLite:SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是:

NULL: 空值

INTEGER: 整数

REAL: 浮点数

TEXT: 字符串

BLOB: 大数据

它是一个轻量级的数据库、非常小 、 移植性好、效率高、可靠

在Android系统中提供了android.database.sqlite包,用于进行SQLite数据库的增、删、改、查工作。

创建与删除数据库

封装一个类去继承SQLiteOpenHelper  在构造函数中传入数据库名称与数据库版本号,数据库被创建的时候会调用onCreate(SQLiteDatabase db) 方法,数据库版本号发生改变的时候会调用onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion)方法,可以方便的对软件游戏升级后做出相应处理避免覆盖安装数据库发生改变产生的错误。调用SQLiteOpenHelper  的getReadableDatabase()方法去创建数据库,如果数据库不存在则创建并且返回SQLiteDatabase对象,如果数据库存在则不创建只返回SQLiteDatabase对象。调用 deleteDatabase(DATABASE_NAME)方法 传入数据库名称则可删除数据库。下面是个简单的例子,用来实现增删改:

  1. public class UserService {

  2. private DatabaseHelper helper;

  3. public UserService(Context context, String name, int version) {

  4. helper = new DatabaseHelper(context, name, version);

  5. }

  6. public UserService(Context context, String name) {

  7. helper = new DatabaseHelper(context, name);

  8. }

  9. public void insert(UserDao user) {// 插入数据

  10. SQLiteDatabase sdb = helper.getWritableDatabase();

  11. ContentValues values = new ContentValues();

  12. values.put(“username”, user.getUsername());

  13. values.put(“password”, user.getPassword());

  14. sdb.insert(“user”, “name”, values);

  15. sdb.close();

  16. }

  17. public void delete(int id) {// 删除数据

  18. SQLiteDatabase sdb = helper.getWritableDatabase();

  19. sdb.delete(“user”, “id=?”, new String[]{String.valueOf(id)});

  20. sdb.close();

  21. }

  22. public void update(UserDao user, int id) {// 更新数据

  23. SQLiteDatabase sdb = helper.getWritableDatabase();

  24. ContentValues values=new ContentValues();

  25. values.put(“username”, user.getUsername());

  26. values.put(“password”, user.getPassword());

  27. sdb.update(“user”, values, “id=?”, new String[]{String.valueOf(id)});

  28. sdb.close();

  29. }

  30. public Cursor select() {// 查询所有数据

  31. SQLiteDatabase sdb = helper.getWritableDatabase();

  32. return    sdb.query(“user”, new String[]{“id as _id”,“username”,“password”}, null, null, null, null, null);

  33. }

  34. public UserDao find(int id){//按id查询数据

  35. UserDao user=null;

  36. SQLiteDatabase sdb=helper.getWritableDatabase();

  37. Cursor cursor=sdb.query(“user”, new String[]{“id”,“username”,“password”}, “id=?”, new String[]{String.valueOf(id)}, null, null, null);

  38. if(cursor.moveToFirst()){

  39. user=new UserDao();

  40. user.setId(cursor.getInt(0));

  41. user.setUsername(cursor.getString(1));

  42. user.setPassword(cursor.getString(2));

  43. }

  44. cursor.close();

  45. sdb.close();

  46. return user;

  47. }

  48. }

插入数据:通过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。

4、**contentprovider:**contentprovider四种基本概念

1、  ContentProvider提供为存储和获取数据提供了统一的接口;

2、  使用ContentProvider可以在不同的应用程序之间共享数据

3、  Android为常见的一些数据提供了ContentPrivider(包括音频,视频,图片和通讯录等等)

ContentProvider使用表的形式来组织数据

Uri

1、  每一个ContentProvider都拥有一个公共的uri,这个uri用于表示这个ContentProvider所提供的数据

2、  Android所提供的ContentProvider都存放在android.provider包当中

Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:

1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。

2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

我一直以来都有整理练习大厂面试题的习惯,有随时跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。

不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?

我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。

我可以将最近整理的一线互联网公司面试真题+解析分享给大家,大概花了三个月的时间整理2246页,帮助大家学习进步。

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是部分内容截图:

部分目录截图

d)**
[外链图片转存中…(img-HxqCc9w7-1711733159296)]

最后

我一直以来都有整理练习大厂面试题的习惯,有随时跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。

不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?

我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。

我可以将最近整理的一线互联网公司面试真题+解析分享给大家,大概花了三个月的时间整理2246页,帮助大家学习进步。

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是部分内容截图:

[外链图片转存中…(img-tnarjqsb-1711733159296)]

[外链图片转存中…(img-qplcUhga-1711733159296)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值