《第一行代码--Android》读书笔记之数据存储

原创 2015年11月20日 22:09:19

文件存储:

  • android的文件存储用的是java IO流那一套,所以这里先简单地总结一下java IO的一些重要知识点。
    这里写图片描述
    • IO流分为两大类,字节流和字符流,它们之间的桥梁是outputStreamWriter和inputStreamReader。
    • 字节流,处理一些二进制编码的文件,比如MP3,音频文件的读取和写入用字节流处理会方便一些。为了能够提高读写效率,一次性把数据写、读。我们采用DataOutputStream。针对file的写、读,我们使用DataOutputStream装饰FileOutputStream;针对byte的写读,我们使用DataOutputStream装饰ByteArrayOutputStream。这里写图片描述
    • 字符流,方便处理字符编码的文件。这里写图片描述
  • 由于android中,Context类中提供了一个openFIleOutput()方法,返回一个FileOutputStream对象。此方法有两个参数,第一个参数是指定文件名,第二个参数是指定文件的操作模式,MODE_PRIVATE(默认的操作模式,覆盖原文件的内容),MODE_APPEND(往文件追加内容,不存在就创建新的文件)。
private void load()  {
        BufferedReader in=null;
        StringBuilder content=new StringBuilder();
        try {
            in=new BufferedReader(new InputStreamReader(openFileInput("data")));
            String text="";
            while ((text=in.readLine())!=null){
                content.append(text);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                edit.setText(content);
            }
        }
    }

SharedPreferences存储

SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据。

  • 得到SharedPreferences的对象实例
    • 在Context类中的getSharedPreferences()方法
    • 在Activity类中的getPreference()方法
    • PreferenceManager类中的getDefaultSharedPreferences()静态方法。
  • 获得SharedPreference.Editor对象,通过SharedPreference对象的edit()方法
  • 向Editor对象添加数据
  • 调用commit()方法将添加的数据提交。
//实例化SharedPreferences对象(第一步) 
SharedPreferences mySharedPreferences= getSharedPreferences("test", 
Activity.MODE_PRIVATE); 
//实例化SharedPreferences.Editor对象(第二步) 
SharedPreferences.Editor editor = mySharedPreferences.edit(); 
//用putString的方法保存数据 
editor.putString("name", "Karl"); 
editor.putString("habit", "sleep"); 
//提交当前数据 
editor.commit(); 

SQLite数据库存储

android为了方便对数据库进行创建(onCreate)和升级(onUpdate),专门提供了一个SQLiteOpenHelper帮助类。数据库的操作是增删改查(CRUD).

  • 创建数据库和建立表(Create)
    • 创建一个自定义的帮助类继承自抽象类SQLiteOpenHelper,必须重写onCreate()onUpdate()两个抽象方法。定义帮助类的构造函数,SQLiteOpenHelper(Context context, String DataBaseName, CursorFactory factory, int version);
    • 实例化自定义的帮助类,调用getReadableDatabase()getWritableDatabase()打开或创建一个数据库,返回可读写的数据库对象
    • 要在数据库中建立一个表,调用db.execSQL();参数传入建表SQL语句。
      建立表
      create table [表名]
      (
      –[字段] [数据类型] [列的特征],
      id int identity(1,1) not null,–identity(1,1) 是自动增长(起始值,递增值) ,not null 是不许为空(默认允许为空)
      name varchar(20) not null,
      )
protected static final String CREATE_BOOK="create table Book(" +
            "id integer primary key autoincrement," +
            "author text," +
            "price real," +
            "pages integer," +
            "name text," +
            "category_id integer)";
  • 升级数据库
    • 实例化自定义帮助类时,传入不同的版本号id,会调用其中的onUpdata()函数。
    • 在onUpdata()函数中进行相关的更新数据库操作。
  • 添加数据(Insert)
    • 创建一个ContentValue对象,给调用这个对象的put()方法填入(key-value)数据。
    • 调用db.insert(String table, String nullColumnHack, ContentValues values),第二个参数一般传入null。
  • 更新数据(Update)
    • 创建一个ContentValue对象,给调用这个对象的put()方法填入要更新的(key-value)数据。
    • 调用public int update(String table, ContentValues values, String whereClause, String[] whereArgs)方法,第三,四个参数是SQL语句的where部分,需要用占位符?来指定具体更新更新哪一行。
      `db.update(“Book”, values, “id>?”, new String[]{“1”});
  • 删除数据(Delete)
    • 调用public int delete(String table, String whereClause, String[] whereArgs)方法。
  • 查找数据(Query)
    • 调用db.public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having,String orderBy),最简单的用法是除了传入表名外,其他全部传null。此方法返回一个cursor对象
    • 遍历Cursor对象,cursor.moveToFirst(),将数据的指针移动到第一行的位置,然后利用循环,调用cursor.get~(cursor,getColumnIndex(“”))方法获得数据,最后调用cursor.moveToNext()。
SQLiteDatabase db=myDatabaseHelper.getWritableDatabase();
                Cursor cursor=db.query("Book",null,null,null,null,null,null);
                if (cursor.moveToFirst()) {
                    while(cursor.moveToNext()){
                        String name=cursor.getString(cursor.getColumnIndex("name"));
                        String author=cursor.getString(cursor.getColumnIndex("author"));
                        int pages=cursor.getInt(cursor.getColumnIndex("pages"));
                        double price=cursor.getDouble(cursor.getColumnIndex("price"));
                        Log.d("MainActivity","book name is"+name);
                        Log.d("MainActivity","book author is"+author);
                        Log.d("MainActivity","book pages is"+pages);
                        Log.d("MainActivity","book price is"+price);
                    }
                }
                cursor.close();
  • 使用SQL操作数据库
    • 添加数据,SQL语句:insert into table1(field1,field2) values(value1,value2),
      db.execSQL(“insert into Book (name,author,pages)values(?,?,?)”,new String[]{“TellH”,”tlh”,”123”});
    • 更新数据,SQL语句:update table1 set field1=value1 where 范围,
      db.execSQL(“updata Book set price=? where name=?”,new String[]{“123”,”TellH”});
    • 删除数据,SQL语句:delete from table1 where 范围,
      db.execSQL(“delete from Book where pages>?”,new String[] {“123”});
    • 查询数据,SQL语句,select * from table1 where field1 like ’%value1%’ ;
      db.rawQuery(“select * from Book”,null);
  • 使用事务 ,保证一系列的操作要么全部完成,要么一个都不会完成。
SQLiteDatabase db=myDatabaseHelper.getWritableDatabase();
                db.beginTransaction();
                try {
                    db.delete("Book",null,null);
                    if (true) {
                        throw new NullPointerException();
                    }
                    ContentValues values=new ContentValues();
                    values.put("name","Game");
                    values.put("author","TT");
                    values.put("pages",123);
                    values.put("price",222);
                    db.insert("Book", null, values);
                    db.setTransactionSuccessful();
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    db.endTransaction();//如果事务没有执行成功,删除操作是不能生效的。
                }

参考的资料和文献:
DataOutputStream、FileOutputStream和ByteArrayOutputStream:http://m.blog.csdn.net/blog/linchengzhi/7620634
java中的IO操作:http://www.zaojiahua.com/1453.html
经典SQL语句大全: http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

依据行业特性进行ERP选型

    我们知道,ERP选型包括两个方面,一是如何选择实施顾问,二是如何考察ERP产品本身。在以前的文章中,我详细阐述过如何去选择一位优秀的实施顾问作为企业ERP项目的教练,今天,我就从产品这一方...
  • itkbase
  • itkbase
  • 2008年06月08日 10:37
  • 363

Android数据库高手秘籍(一)——SQLite命令

要想熟练地操作任何一个数据库,最最基本的要求就是要懂SQL语言,这也是每个程序员都应该掌握的技能。虽说SQL博大精深,要想精通确实很难,但最基本的一些建表命令,增删改查,大家还是必须要学会的。 SQL...
  • sinyu890807
  • sinyu890807
  • 2014年09月04日 09:10
  • 78002

阅读郭林《第一行代码》的笔记——第11章 Android特色开发,基于位置的服务

1、基于位置的服务简介基于位置的服务(Location Based Service )简称LBS,这个技术随着移动互联网的兴起,在最近的几年里十分火爆。其实它本身并不是什么时髦的技术,主要的工作原理就...
  • u010102829
  • u010102829
  • 2016年10月07日 10:07
  • 857

Android Volley完全解析(郭林老师作品)

Android Volley完全解析(一),初识Volley的基本用法 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/...
  • Rebirth_Love
  • Rebirth_Love
  • 2016年07月26日 21:11
  • 1261

Android事件分发机制完全解析,带你从源码的角度彻底理解(下) (出自郭林老师)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了And...
  • xiashuangyuan1
  • xiashuangyuan1
  • 2017年05月17日 23:09
  • 203

阅读郭林《第一行代码》的笔记——第11章 Android特色开发,基于位置的服务

1、基于位置的服务简介基于位置的服务(Location Based Service )简称LBS,这个技术随着移动互联网的兴起,在最近的几年里十分火爆。其实它本身并不是什么时髦的技术,主要的工作原理就...
  • u010102829
  • u010102829
  • 2016年10月07日 10:07
  • 857

Android 6.0 运行时权限处理问题

序自从升级到Android M以来,最大的改变就是增加了运行时权限RuntimePermission,6.0以上的系统如果没有做适配,运行了targetSDK=23的App时就会报权限错误。我们知道6...
  • xiangzhihong8
  • xiangzhihong8
  • 2016年09月11日 19:28
  • 1107

阅读郭林《第一行代码》的笔记——第12章 Android特色开发,使用传感器

1、传感器简介手机中内置的传感器是一种微型的物理设备,它能够探测、感受到外界的信号,并按一定规律转换成我们所需要的信息。Android手机通常都会支持多种类型的传感器,如光照传感右器、加速度传感器、地...
  • u010102829
  • u010102829
  • 2016年10月11日 09:34
  • 758

阅读郭林《第一行代码》的笔记——第1章 开始启程,你的第一行Android代码

一、Android系统架构 Android大致可以分为四层架构,五块区域。 1.Linux内核层 Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱...
  • u010102829
  • u010102829
  • 2016年05月13日 20:29
  • 1827

Android优秀开发资源

Android Frameworks源码 https://github.com/android/platform_frameworks_base 开源项目 1.philm:https...
  • djwmzyl
  • djwmzyl
  • 2016年10月10日 10:52
  • 930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《第一行代码--Android》读书笔记之数据存储
举报原因:
原因补充:

(最多只允许输入30个字)