Android中数据的存储方式(二)—SQLite数据库

来源:互联网 发布:友情女王网络调教 编辑:程序博客网 时间:2024/06/10 14:24

程序中很重要的一部分是数据的交换,而交换中很重要一点是如何实现数据的存储。根据数据的作用,选择不同的保存方式和使用权限。Android数据的存储有如下6种:

  • 保存数据到应用 程序私有的文件夹下
  • 保存到公共的sd卡上
  • sharedpreferences保存
  • 使用xml文件去保存
  • 使用数据库保存
  • 内容提供者(Content provider)

一、概述

sqlite较其它android数据保存方式,sqlite能保存大量的结构相同的数据

  • 支持标准的SQL语法

    • 创建表

      create table person(            _id integer primary key autoincrement,             name varchar(20),             age integer);
    • 增加一条记录
      insert into person(name) values(‘tom‘, 25);

    • 删除一条记录
      delete from person where name = 'tom';

    • 修改一条记录
      update person set name = 'lisi' where name = 'tom';

    • 查询数据
      select * from person;

    • 修改表结构
      alter table person add balance integer;
  • google提供的api(CRUD)
    google提供的CRUD的API很重要的一个特点是:每一个操作都有返回值(返回对应的行号),就此可以判断数据操作是否成功。注意,每次使用了数据库后都要close()。

    • 增加一条记录

      SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "zhangsan"); values.put("age", 4); long rowid = db.insert(“person”, null, values);
    • 删除一条记录

      SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete("person", "personid<?", new String[]{"2"}); db.close(); 
    • 修改一条记录

      SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); //key为字段名,value为值values.put(“name”, “zhangsan”); //下面把id为1的人删除掉db.update("person", values, "personid=?", new String[]{"1"}); db.close(); 
    • 查询数据
      query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)方法各参数的含义:
      table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。
      columns:要查询出来的列名。相当于select语句select关键字后面的部分。
      selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”
      selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
      groupBy:相当于select语句group by关键字后面的部分
      having:相当于select语句having关键字后面的部分
      orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
      limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。

      SQLiteDatabase db = databaseHelper.getWritableDatabase(); //下面的参数依次是:表、选择的行、条件、条件替代符内容、groupBy、having、排序方式、limitCursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%zhang%"}, null, null, "personid desc", "1,2"); while (cursor.moveToNext()) {          int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始         String name = cursor.getString(1);//获取第二列的值         int age = cursor.getInt(2);//获取第三列的值 } cursor.close(); db.close(); 

二、使用步骤

sqlite是内置的,通过继承SQLiteOpenHelper,就可以操作数据库,必须重写两个函数onCreate和onUpgrade
onCreate只在创建时调用一次,而之后每一次的版本更新,都调用onUpgrade方法
数据库的使用步骤是:
1.新建工程后,创建一个类继承SQLiteOpenHelper类,并重写一个构造函数和两个方法
2.在DAO层中创建SQLiteOpenHelper类,并调用sqlite.getWritableDatabase()方法,获取SQLiteDatabase
3.当版本需要变更时,需要修改程序中的构造方法,调整版本参数(最后一位参数)

public MySqliteOpenHelper(Context context) {        super(context, "sky.db", null,1);}

4.为sqlite加入增删改查方法
5.关闭SQLiteDatabase
6.进行Test测试
这里写图片描述

三、版本问题

版本跳跃问题
由版本1跳到版本3的处理方法,根据 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法参数的oldVersion和newVersion,写switch语句让不同的版本可以操作跳跃版本情况

四、数据库事务

数据库事务,一个事务的流程是:1.明确事务,2.开始这个事务,3.结束事务。事务如果只开始不结束,就回滚(即不执行事务中对数据的操作)。

//开始事务  db.beginTransaction();  try {              Update account set money=money-100 where name=’aaa’;    Update account set money=money+100 where name=’bbb’;    db.execSQL("update account set money=money-100 where name='aaa'");    int i = 1/0;    db.execSQL("update account set money=money+100 where name='bbb'");    db.setTransactionSuccessful();    } finally {    //只有下面的方法执行,事务才会完成,否则回滚      db.endTransaction();    }
0 0
原创粉丝点击