对于数据的存储和访问是android的很重要的一块内容,比如参数的保存,文件的访问,数据库的存储和访问,对内容提供者的建立和访问等等。

这里我们就对下面的这些存储方式进行一下剖析:

------------------------------------------------------------------------------------------------

1) sharedpreferences
         应用场景:保存简单、少量的键值对数据,一般用作应用参数的保存
         实现:XML文件
         好处:比自己写代码更简单

看一段保存数据的代码:

//得到一个实现Editor接口的对象,文件模式为private模式,表示只有当前应用可以访问并且新的文件内容会覆盖旧的文件内容

SharedPreferences.Editor editor = getSharedPreferences("test",MODE_PRIVATE).edit();
  //在文件中加入键值对 text为键 内容为hello 当前内容在内存中 且存在于editor对象中
   editor.putString("text", "hello");

//把内容提交给preference对象 对数据进行保存 文件保存在data/data/包名/shared_prefs中 文件名没加后缀 因为系统自动会给文件补加.xml

editor.commit();

下面是一段读取内容的代码:

//得到preference对象

SharedPreferences prefs = getSharedPreferences("test", MODE_PRIVATE);
//得到text键对应的内容
   String restoredText = prefs.getString("text", null);

//可以把内容赋值给一个textview组建进行显示
   if (restoredText != null) {
   mSaved.setText(restoredText, TextView.BufferType.EDITABLE);

2) 应用程序内的数据保存
     非键值对格式、或者自定义格式、数组字符串等
     相对少量的字符串
     例如:{”asfas“, "asfasfd", "132123"}

//打开一个输出流 如果文件不存在 系统会自动创建

FileOutputStream openFileOutput = openFileOutput("test.txt", MODE_APPEND);

//这里用了通用的字符流读写方式 把"test"转换为byte写入文件中
          openFileOutput.write("test".getBytes());

文件的读取:

//打开一个输入流连接到test.txt文件上
          FileInputStream openFileInput = openFileInput("test.txt");

//创建一个字节数组输出流 把文件读取的内容先暂时存到内存中
          ByteArrayOutputStream stream = new ByteArrayOutputStream();

//创建一个1k的缓冲
          byte[] buffer = new byte[1024];
          int length = -1;

//判断是否读到了文件的末尾
          while ((length  = openFileInput.read(buffer)) != -1){

//由于文件最后的读入不一定是1024,所以用参数length来保证
                        stream.write(buffer, 0, length);
                    }

//把字节流转换为字符串                
                    String str = stream.toString();

3)External store SD卡
         场景:较大或者大量的文件
         例如:极品飞车、实况足球等大型游戏,
                  数据包安装到SD卡上,节省内存空间。
         缺点:读取速度相对内存较慢,以时间换空间
         SDCard路径:      "/mnt/sdcard/test.txt"

读写方式和应用程序内的数据类似

"/mnt/sdcard/"的目录可以用Environment.getExternalStorageDirectory()得到

File file = new File(Environment.getExternalStorageDirectory(), filename);

但是需要注意添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

4) 数据库SQLite
         在Android中使用数据库的场景:
               有大量相同类型数据需要增删改查
               a) 联系人、短信、多媒体等系统应用
               b) 管理类应用,比如Launcher、SoftMarket

SQLite步骤:
         a) 声明一个类,继承SQLiteOpenHelper
         b) 覆写onCreate()/onUpgrade()/构造方法
           public XXXSQLiteHelper(Context context){
                super(context, "test.db", null, 1);

}
         c) 创建数据库辅助类的实例(new XXXSQLiteHelper())
         d) 通过helper.getWritableDatabase()获取数据库访问实例
         e) 用SQLiteDatabase的execSQL()方法实现增删改
            用rawQuery()方法实现查询                 
创建表:

String sql = "CREATE TABLE person (personid integer primary key autoincrement, name varchar(20), phone VARCHAR(12) NULL)"

db.execSQL(sql);

插入语句:

SQLiteDatabase db = mDBHelper.getWritableDatabase();

db.execSQL("insert into person(name, phone) values(?, ?)", new String[]{"tom", "13812312312"});

升级表
db.execSQL("ALTER TABLE person ADD salary VARCHAR(12) NULL");

插入数据
        SQLiteDatabase db = mHelper.getWritableDatabase();
        db.execSQL("insert into person(name, phone) values(?, ?)", new String[]
        {"tom", "13812312312"});

查询数据
        SQLiteDatabase db = mHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("select * from person where personid=?", new String[]
        {"1"});
        if (cursor.moveToFirst())
        {
            int personid1 = cursor.getInt(cursor.getColumnIndex("personid"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String phone = cursor.getString(cursor.getColumnIndex("phone"));
            System.out.println();
        }

更新数据
        db.execSQL("update person set name=?, phone=? where personid=?", new Object[]
        {"tom", "18675510130", 1});

删除数据

"delete from person where personid=?", new Object[]{1}

转载于:https://blog.51cto.com/3489316/657692

Andorid提高--数据持久化相关推荐

  1. 数据持久化框架为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框 ...

  2. Java 数据持久化系列之池化技术

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 在上一篇文章Java 数据持久化系列之JDBC中,我们了解到使用 ...

  3. iOS中几种数据持久化方案总结

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  4. Spring Cloud Alibaba基础教程:Nacos的数据持久化

    <Spring Cloud Alibaba基础教程>连载中,关注我一起学习!前情回顾: <使用Nacos实现服务注册与发现> <支持的几种服务消费方式> <使 ...

  5. Redis数据持久化

    总的来说有两种持久化方案:RDB和AOF RDB方式按照一定的时间间隔对数据集创建基于时间点的快照. AOF方式记录Server收到的写操作到日志文件,在Server重启时通过回放这些写操作来重建数据 ...

  6. 重启redis命令_redis系列之——数据持久化(RDB和AOF)

    在数据库(如mysql)和缓存(如redis)的发展中,都会相互借鉴对方的长处来弥补自身的不足.比如mysql作为持久化数据库,为了提高数据的访问速度,会使用缓存技术,当一条sql查询完成后,mysq ...

  7. iOS - 数据持久化之 FMDB 的使用

    前言 上一篇文章「iOS - 使用 SQLite 数据库实现数据持久化」,介绍了如何使用 sqlite3 操作 SQLite 数据库实现增删改查.但是在代码编写的过程中,我们发现 sqlite3 需要 ...

  8. jooq实体 和mysql_几个数据持久化框架Hibernate、JPA、Mybatis、JOOQ的比较

    因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibernate ...

  9. 【redismemcached】数据类型、内存管理、数据持久化和集群管理的区别

    这几年redis很火,redis也常常被当做memcached的挑战者被提到桌面上来.关于redis和memcached的比较比比皆是.然而,redis真的在功能.性能以及内存使用效率上都超越memc ...

  10. 漫游Kafka设计篇之数据持久化

    转载注明出处:http://blog.csdn.net/honglei915/article/details/37564595 Kafka视频教程同步首发,欢迎观看! 不要畏惧文件系统! Kafka大 ...

最新文章

  1. windows程序设计 c语言,【教程】基于C语言的Windows编程入门
  2. 考研结束了,使用SpringBoot开发一个考研管理系统
  3. grub-和grub-troubleshootting
  4. 基于LBS的兴趣点查询
  5. android kotlin面试题,Kotlin面试25题
  6. boost::intrusive::offset_ptr用法的测试程序
  7. Vue学习----webpack跨域问题proxyTable
  8. MyBatis-Plus_AR 模式
  9. golang(5)使用beego 开发 api server 和前端同学拆分开发,使用swagger
  10. 谁在控制着 iCloud 中国区账号的密钥?
  11. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(二)
  12. 【LeetCode】Python之旅 1-2
  13. java实现汽车租赁系统
  14. 效率源linux,效率源希捷硬盘修复(4.2版)及程序下载
  15. 4r照片尺寸是多大_数码照片4D、4R、6RW是什么意思?4R照片尺寸是多大图片?
  16. chart metadata is missing these dependencies
  17. WP个人主题源码Cosy3.1.3
  18. 蓝牙RFCOMM协议
  19. 浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解
  20. 网格化管理服务系统,携同用户创新共进步

热门文章

  1. mysql tree 和 hash_mysql_B-tree索引和哈希索引
  2. 帆软单元格以HTML显示内容(点击更改herf值和onclik值)
  3. 六下计算机教学总结,六年级信息技术教师教学工作总结
  4. proteus三输入与非门名字_商标取名大全-有创意的2020商标名字大全
  5. 从零构建一个图像分类项目 -- 代码
  6. MySQL创建新连接时,不能成功连接的问题
  7. CS224N笔记——神经机器翻译与Attention机制
  8. LeetCode每周刷题(2019.6.24-2019.6.30)
  9. 自定义View合辑(2)-饼状图
  10. Vue.js 5 @慕课网