轻量数据库SQLiteDataBase的相关操作方法
Posted 高速转弯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了轻量数据库SQLiteDataBase的相关操作方法相关的知识,希望对你有一定的参考价值。
一、查询操作:
查询操作比较复杂,主要有如下操作:
1 db.rawQuery(String sql, String[] selectionArgs); 2 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 3 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 4 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
1、最为简单,将所有的SQL语句组织到一个字符串中,selectionArgs就是占位符实际参数集
2、columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名,having指定分组条件,配合groupBy使用,orderBy指定排序的列名
3、limit指定分页参数
4、distinct可以指定“true”或“false”表示要不要过滤重复值。
selection、groupBy、having、orderBy、limit这几个参数中不包括“WHERE”、“GROUP BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL关键字。
返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。
Cursor对象的常用方法:
1 cursor.move(int offset); //以当前位置为参考,移动到指定行 2 cursor.moveToFirst(); //移动到第一行 3 cursor.moveToLast(); //移动到最后一行 4 cursor.moveToPosition(int position); //移动到指定行 5 cursor.moveToPrevious(); //移动到前一行 6 cursor.moveToNext(); //移动到下一行 7 cursor.isFirst(); //是否指向第一条 8 cursor.isLast(); //是否指向最后一条 9 cursor.isBeforeFirst(); //是否指向第一条之前 10 cursor.isAfterLast(); //是否指向最后一条之后 11 cursor.isNull(int columnIndex); //指定列是否为空(列基数为0) 12 cursor.isClosed(); //游标是否已关闭 13 cursor.getCount(); //总数据项数 14 cursor.getPosition(); //返回当前游标所指向的行数 15 cursor.getColumnIndex(String columnName);//返回某列名对应的列索引值 16 cursor.getString(int columnIndex); //返回当前行指定列的值
二、添加、更新和删除
1 db.executeSQL(String sql); 2 db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集 3 4 5 db.insert(String table, String nullColumnHack, ContentValues values); 6 db.update(String table, Contentvalues values, String whereClause, String whereArgs); 7 db.delete(String table, String whereClause, String whereArgs);
Insert:
table第一个参数表示操作表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是一组键值对组成,Columnkey代表列名,ColumnValue代表该列要插入的值;
Update:
update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,whereArgs参数是占位符的实际参数值;
delete:
其参数基本一样。
三、具体实例:
1 //打开或创建test.db数据库 2 SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null); 3 db.execSQL("DROP TABLE IF EXISTS person"); 4 //创建person表 5 db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)"); 6 Person person = new Person(); 7 person.name = "john"; 8 person.age = 30; 9 //插入数据 10 db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[]{person.name, person.age}); 11 12 person.name = "david"; 13 person.age = 33; 14 //ContentValues以键值对的形式存放数据 15 ContentValues cv = new ContentValues(); 16 cv.put("name", person.name); 17 cv.put("age", person.age); 18 //插入ContentValues中的数据 19 db.insert("person", null, cv); 20 21 cv = new ContentValues(); 22 cv.put("age", 35); 23 //更新数据 24 db.update("person", cv, "name = ?", new String[]{"john"}); 25 26 Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", new String[]{"33"}); 27 while (c.moveToNext()) { 28 int _id = c.getInt(c.getColumnIndex("_id")); 29 String name = c.getString(c.getColumnIndex("name")); 30 int age = c.getInt(c.getColumnIndex("age")); 31 Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age); 32 } 33 c.close(); 34 35 //删除数据 36 db.delete("person", "age < ?", new String[]{"35"}); 37 38 //关闭当前数据库 39 db.close(); 40 41 //删除test.db数据库 42 // deleteDatabase("test.db"); 43 }
四、SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabse的一个帮助类,用来管理数据的创建和版本更新。一般的用法是定义一个类继承SQLiteOpenHelper,并实现两个回调方法,OnCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabse, int oldVersion, int newVersion)来创建和更新数据库。
一般可以如下获取帮助类的实例: mOpenHelper = new DatabaseHelper(getContext());
他有如下三个类定义:
public SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)
public SQLiteOpenHelper(Context context, String name, int version)
public SQLiteOpenHelper(Context context)
二个回调函数:
public void onCreate(SQLiteDatabase db)
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
//获取SQLiteDatabase实例
SQLiteDatabase db = getWritableDatabase();
SQLiteDatabase db = getReadableDatabase();
五、事务处理
SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。
事务处理应用:很多时候我们需要批量的向Sqlite中插入大量数据时,单独的使用添加方法导致应用响应缓慢, 因为sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。为了保证数据的一致性,避免出现数据缺失等情况。
1 SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); 2 //开启事务 3 db.beginTransaction(); 4 try{ 5 //批量处理操作 6 //do something 7 db.execSQL("SQL语句", new Object[]{}); 8 db.execSQL("SQL语句", new Object[]{}); 9 //设置事务标志为成功,当结束事务时就会提交事务 10 db.setTransactionSuccessful(); 11 } 12 catch(Exception e){ 13 } 14 finally{ 15 //结束事务 16 db.endTransaction(); 17 }
注:以上代码参考:
http://blog.csdn.net/li12412414/article/details/51958774
http://blog.csdn.net/xiaanming/article/details/8679521
以上是关于轻量数据库SQLiteDataBase的相关操作方法的主要内容,如果未能解决你的问题,请参考以下文章
安卓9SQLiteDatabase类ContentValues 类