Android下嵌入式数据库SqlLite使用方法

SQLiteOpenHelper接口简介

为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。

当调用SQLiteOpenHelpergetWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。

onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。

getWritableDatabase()getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

使用步骤:

1.       建立数据库的MyDbOpenHelper,继承SQLiteOpenHelper接口,并覆盖未实现的方法

sqlite数据库标准:
要求我们的数据库的主键  最好要以_id作为名字

public class MyDBOpenHelper extends SQLiteOpenHelper {

       /**

        * @param context 应用程序上下文

        * @param name    数据库的名字

        * @param factory 查询数据库的游标工厂一般情况下用sdk默认的

        * @param version  数据库的版本版本号必须不小1

        */

       public MyDBOpenHelper(Context context, String name, CursorFactory factory,

                     int version) {

              super(context, name, factory, version);

       }

       // mydbOpenHelper 在数据库第一次被创建的时候会执行onCreate();一般为数据库初始化

       @Override

       public void onCreate(SQLiteDatabase db) {

              System.out.println("我被调用了 oncreate");

              db.execSQL("CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))");

       }

//在数据库版本号更新的时候被调用

@Override

       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

              System.out.println("on update ");

              db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL ");

       }

}

2.       在需要调用的方法中

MyDBOpenHelper dbOpenHelper = new MyDBOpenHelper(this,”数据库名字”,null,”版本号”);

一般会改造MyDBOpenHelper,使构造函数只有一个context,然后其他的在super直接赋值。根据业务需求而定

3.    MyDBOpenHelper dbOpenHelper = new MyDBOpenHelper(context);//获得helper

SQLiteDatabase db = dbOpenHelper.getWritableDatabase();//获得可写的数据库对象

即可在方法中使用dbCRUD的操作。

4.    简单的对数据库操作方式

SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的操作方法: insert()delete()update()query() 。这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询操作。

Insert()方法用于添加数据,各个字段的数据使用ContentValues进行存放。 ContentValues类似于MAP,相对于MAP,它提供了存取数据对应的put(String key, Xxx value)getAsXxx(String key)方法,  key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:StringInteger等。

SQLiteDatabase db = databaseHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put("name", "我的名字");

values.put("age", 4);

long rowid = db.insert(person, null, values);//返回新添记录的行号,与主键id无关

参数:

Table:表名

NullcolumnhackSQL不允许放空表放空值,为了防止出现这个情况定义默认列名

ValueContentValue

delete()方法的使用:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

db.delete("person", "personid<?", new String[]{"2"});

db.close();

上面代码用于从person表中删除personid小于2的记录。

参数说明:

,条件,参数

update()方法的使用:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

ContentValues values = new ContentValues();

values.put(“name”, “我的名字”);//key为字段名,value为值

db.update("person", values, "personid=?", new String[]{"1"});

db.close();

上面代码用于把person表中personid等于1的记录的name字段的值改为我的名字

参数说明:

表,更新的数据,条件,参数

query()方法实际上是把select语句拆分成了若干个组成部分,然后作为方法的输入参数:

SQLiteDatabase db = databaseHelper.getWritableDatabase();

Cursor cursor = db.query("person", new String[]{"personid,name,age"}, "name like ?", new String[]{"%我的名字%"}, null, null, "personid desc", "1,2");

if (cursor.moveToFirst()) {

while (cursor.moveToNext()) {

         int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始

        String name = cursor.getString(1);//获取第二列的值

        int age = cursor.getInt(2);//获取第三列的值

}

}

cursor.close();

db.close();

上面代码用于从person表中查找name字段含有我的名字的记录,匹配的记录按personid降序排序,对排序后的结果略过第一条记录,只获取2条记录。

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关键字后面的部分。

5.    使用事务操作SQLite数据库

使用SQLiteDatabasebeginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。使用例子如下:
SQLiteDatabase db = ....;

db.beginTransaction();//开始事务

try {

    db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"名字", 4});

    db.execSQL("update person set name=? where personid=?", new Object[]{"", 1});

    db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务

} finally {

    db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务

}

db.close();

上面两条SQL语句在同一个事务中执行。

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

6.    传统的对数据库CRUD的方式

对数据库进行CRUD操作

Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()rawQuery()方法。 execSQL()方法可以执行insertdeleteupdateCREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。

增删改操作:

SQLiteDatabase db = ....;

db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"我的名字", 4});

db.close();

execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。

查询操作:

SQLiteDatabaserawQuery() 用于执行select语句,使用例子如下:
SQLiteDatabase db = ....;

Cursor cursor = db.rawQuery(select * from person, null);

while (cursor.moveToNext()) {

       int personid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始

       String name = cursor.getString(1);//获取第二列的值

       int age = cursor.getInt(2);//获取第三列的值

}

cursor.close();

db.close();

rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:

Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%我的名字%", "4"});

Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc,其实CursorJDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true )。

更多相关文章

  1. Andorid读写全局配置文件的方法
  2. Android(安卓)Service在bindService不能触发onServiceConnected
  3. [zz]Android(安卓)Button背景图片
  4. Android(安卓)Studio使用---眼花缭乱的插件使用技巧
  5. android jni开发流程
  6. 学习:Android生命周期
  7. Android之使用网络技术
  8. android中的数据存储 收藏
  9. android 系统重启关机 方法 非常好的一篇文章

随机推荐

  1. Android流式布局实现
  2. 在Android平台上实现条型码扫描与识别
  3. Android布局中的常用属性小结
  4. 三星平台 android audio 架构探讨点滴积
  5. Android问题(一)Android(安卓)Studio 提示"
  6. Android2.3发布
  7. NDK编译Android字符界面的可执行程序
  8. 【Android】自定义控件之View原理与使用
  9. Android(安卓)2.2新增Widget之ProtipWidg
  10. Hello, Android!