Sqlite 是一款轻型的数据库,是遵守ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式开发中。
Sqlite的数据类型:Typelessness(物类型),可以保存任何类型的数据到你所想要保存的任何表的任何列中,但它又支持常见的类型如:NULL,VARCHAR,TEXT,INTEGER,BLOG,CLOB....等等,唯一例外的是:integer primary key 此字段只能存储64为整数
在Android系统中,提供了SQLiteOpenHelper抽象类,该类用于对数据库版本进行管理,该类中常用的方法:
onCreate 数据库创建时调用此方法(第一次连接获取数据库对象时执行)
onUpgrade 数据库更新时调用此方法(版本号改变时执行)
onOpen 数据库每次打开时执行(每次打开数据库时调用哦,在onCreate、onUpgrade方法之后
1.使用SQLiteDatabase操作SQLite数据库
Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据的添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete),这些操作简称为(CRUD)
execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句(查询query)。
首先创建数据库类:
1 public class MySqliteOpenHelper extends SQLiteOpenHelper { 2 3 /** 4 * 数据库名称 5 */ 6 private static final String name = "database.db"; 7 8 /** 9 * 数据库版本号 10 */ 11 private static final int version = 1; 12 13 public MySqliteOpenHelper(Context context) { 14 super(context, name, null, version); 15 } 16 17 /** 18 * 数据库创建时调用 19 */ 20 @Override 21 public void onCreate(SQLiteDatabase db) { 22 // 创建表database 23 String sql = "create table database (_id integer primary key autoincrement,name varchar(20),age varchar(20))"; 24 db.execSQL(sql); 25 } 26 27 /** 28 * 数据库更新时调用 29 */ 30 @Override 31 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 32 // TODO Auto-generated method stub 33 34 } 35 36 }
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法
方法名 | 方法描述 |
public MySqliteOpenHelper(Context context, String name, CursorFactory factory, int version) |
构造方法,一般传递一些参数 |
onCreate(SQLiteDatabase db) | 创建数据库时调用 |
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) | 版本更新时调用 |
getReadableDatabase() | 获取可读的SqliteDatabase |
getWritableDatabase() | 获取可写的SqliteDatabase |
创建数据库:
1 /** 2 * 数据库帮助类 3 */ 4 private MySqliteOpenHelper helper; 5 6 public DatabaseUtils(Context context){ 7 helper = new MySqliteOpenHelper(context); 8 }
数据库的增删改查:
1 /** 2 * 将数据插入数据库 3 */ 4 public void insert(){ 5 SQLiteDatabase db = null; 6 try { 7 db = helper.getWritableDatabase(); // 获得可写的SQliteDatabase 8 db.beginTransaction(); // 开启事务 9 String sql = "insert into database values(null,‘zhangsan‘,‘20‘)"; 10 db.execSQL(sql); // 执行语句 11 db.setTransactionSuccessful(); // 调用此方法会在执行到endTransaction()方法时提交当前事务,如果不调用此方法会回滚事务 12 }finally{ 13 if(db != null){ 14 db.endTransaction(); // 事务的结束的标志,决定是提交事务还是回滚事务 15 } 16 } 17 db.close(); 18 } 19 20 /** 21 * 更新数据库中的数据 22 */ 23 public void update(){ 24 SQLiteDatabase db = helper.getWritableDatabase(); // 获得可写的SQliteDatabase 25 ContentValues values = new ContentValues(); 26 values.put("name", "lisi"); 27 db.update("database", values, "name = ?", new String []{"zhangsan"}); 28 db.close(); 29 } 30 31 /** 32 * 查询数据库 33 */ 34 public void query(){ 35 SQLiteDatabase db = helper.getReadableDatabase(); // 获得可读的SQliteDatabase 36 String sql = "select name,age from database"; 37 38 Cursor cursor = db.rawQuery(sql, null); 39 while(cursor != null && cursor.moveToNext()){ // cursor 不为null 防止出现空指针异常 moveToNext ()移动到下一行 40 String name = cursor.getString(0); // 获得第一列的值,第一列的索引从0开始 41 int age = cursor.getInt(1); // 获得第二列的值 42 System.out.println("name : " + name + "," + "age :" + age); 43 } 44 45 cursor.close(); 46 db.close(); 47 48 } 49 50 /** 51 * 删除数据库中的数据 52 */ 53 public void delete(){ 54 SQLiteDatabase db = helper.getWritableDatabase(); // 获得可写的SQliteDatabase 55 db.delete("database", null, null); 56 db.close(); 57 }
Cursor是结果集游标,用于对结果集进行随机访问,与jdbc中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移到了最后吧一行,返回结果为false,否则为true。另外Cursor还用常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移动到了结果集的第一行,返回值为false,否则为true)、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true)和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true);
使用事务操作Sqlite数据库
SQLiteDatabase db = null;
try {
db = helper.getWritableDatabase();
db.beginTransaction(); // 开启事务
String sql = "insert into database values(null,‘zhangsan‘,‘20‘)";
db.execSQL(sql);
db.execSQL("update database set name=? where age=?", new Object[]{"wangwu", 20});
db.setTransactionSuccessful(); // 调用此方法会在执行到endTransaction()方法时提交当前事务,如果不调用此方法会回滚事务
}finally{
if(db != null){
db.endTransaction(); // 事务的结束的标志,决定是提交事务还是回滚事务
}
}
db.close();
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction()方法时会检查事务的标志是否成功,如果程序执行到endTransaction()方法之前调用了setTransactionSuccessful()方法设置事务的标志为成功,则提交事务,如果没有调用setTransactionSuccessful()方法则回滚事务