轻量数据库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的相关操作方法的主要内容,如果未能解决你的问题,请参考以下文章

SQliteDatabase详解

android的数据存储方式

安卓9SQLiteDatabase类ContentValues 类

Android使用SQLiteDatabase操作SQLite数据库

C#操作SQLite数据库

SQLite的使用:简介及原生SQL操作数据库