基础学习总结(四)--SQLite
1. SQLiteDatabase
操作SQLite数据库的类。可以执行SQL语句,对数据库进行增、删、查、改的操作。也可以进行transaction的控制。很多类对数据库的操作最终都是通过SQLiteDatabase实例来调用执行的。
需要注意的是,数据库对于一个应用来说是私有的,并且在一个应用当中,数据库的名字也是惟一的。
2. SQLiteOpenHelper
创建数据库和数据库版本管理的辅助类。这是一个抽象类,所以我们一般都有一个SQLiteOpenHelper子类,需要继承实现
· void onCreate(SQLiteDatabase db)
在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表。
· void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。
而void onOpen(SQLiteDatabase db) 则可以选择重写。同时此类还有3个synchronized方法:void close(),SQLiteDatabasegetReadableDatabase(),SQLiteDatabasegetWritableDatabase()。
3. Cursor
游标。要注意这是一个接口。但很多时候我不需要知道它具体是哪个子类,直接按照API Doc里面提供的方法调用就行了。通过Cursor 我们可以对从数据库查询出来的结果集进行随机的读写访问。对于数据库的查询结果,一般是由子类SQLiteCursor返回的。
1. 加载驱动.
2. 连接数据库.
3. 操作数据库.
SQLite:一款轻量级的数据库,除了主键(Primark key)需要设置为Integer类型且填充数据必须是integer类型,其它字段均任意类型填充
字段属性与语法sqlserver类似,但无关键字
在android系统中提供了SQLiteOpenHelper抽象类,用于版本管理与操作:
onCreate:数据库创建时执行
onUpgrade:数据库更新版本时执行
onOpen:数据库打开连接时执行
实现SQLiteOpenHelper抽象类
1 /* 2 * 数据库帮助类 3 * */ 4 public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { 5 6 7 public PersonSQLiteOpenHelper(Context context) { 8 //super(context, name, factory, version); 9 /* 10 * context 上下文 11 * name 数据库名 12 * factory游标工厂 13 * version 版本,必须大于1*/ 14 super(context, "cuiOne.db", null, 1); 15 // TODO Auto-generated constructor stub 16 } 17 18 //数据库第一次创建时回调此方法 19 //初始化一些表 20 @Override 21 public void onCreate(SQLiteDatabase db) { 22 // TODO Auto-generated method stub 23 String sql="create table Person(_id integer primary key,age integer,name 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 }
使用sql语句实现数据的insert、query
1 public class Persondao { 2 PersonSQLiteOpenHelper mOpenHelper;//成员变量 3 4 public Persondao(Context context){ 5 mOpenHelper=new PersonSQLiteOpenHelper(context); 6 } 7 8 public void insert(Person p){ 9 //赋给db写入权限 10 SQLiteDatabase db= mOpenHelper.getWritableDatabase(); 11 //判断数据库状态是否为打开状态 12 if(db.isOpen()){ 13 db.execSQL("insert into person(name,age) values(?,?);", new Object[]{p.getName(),p.getAge()}); 14 db.close(); 15 } 16 } 17 18 public List<Person> queryAll(){ 19 SQLiteDatabase db=mOpenHelper.getReadableDatabase(); 20 if(db.isOpen()){ 21 Cursor rawCur = db.rawQuery("select _id,age,name from Person", null); 22 if(rawCur!=null&&rawCur.getCount()>0){ 23 List<Person> list=new ArrayList<Person>(); 24 int id;int age;String name; 25 while(rawCur.moveToNext()){ 26 id=rawCur.getInt(0); 27 age=rawCur.getInt(1); 28 name=rawCur.getString(1); 29 list.add(new Person(id,age,name)); 30 } 31 db.close(); 32 return list; 33 } 34 db.close(); 35 } 36 return null; 37 } 38 39 public Person queryItem(int id){ 40 SQLiteDatabase db=mOpenHelper.getReadableDatabase(); 41 if(db.isOpen()){ 42 Cursor cur=db.rawQuery("select _id,age,name from Person where _id=?;", new String[]{String.valueOf(id)}); 43 //判断游标在移动到下一个位置时是否有值 44 if(cur!=null&&cur.moveToFirst()){ 45 int _id=cur.getInt(0); 46 int age=cur.getInt(1); 47 String name=cur.getString(2); 48 db.close(); 49 return new Person(_id,age,name); 50 } 51 db.close(); 52 } 53 return null; 54 55 } 56 }
使用SQLite工具类实现i,d,u,q
public class PersonDao2 { private static final String TAG = "PersonDao2"; private PersonSQLiteOpenHelper mOpenHelper; // 数据库的帮助类对象 public PersonDao2(Context context) { mOpenHelper = new PersonSQLiteOpenHelper(context); } /** * 添加到person表一条数据 * @param person */ public void insert(Person person) { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if(db.isOpen()) { // 如果数据库打开, 执行添加的操作 ContentValues values = new ContentValues(); values.put("name", person.getName()); // key作为要存储的列名, value对象列的值 values.put("age", person.getAge()); long id = db.insert("person", "name", values); Log.i(TAG, "id: " + id); db.close(); // 数据库关闭 } } /** * 更据id删除记录 * @param id */ public void delete(int id) { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // 获得可写的数据库对象 if(db.isOpen()) { // 如果数据库打开, 执行添加的操作 String whereClause = "_id = ?"; String[] whereArgs = {id + ""}; int count = db.delete("person", whereClause, whereArgs); Log.i(TAG, "删除了: " + count + "行"); db.close(); // 数据库关闭 } } /** * 根据id找到记录, 并且修改姓名 * @param id * @param name */ public void update(int id, String name) { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if(db.isOpen()) { // 如果数据库打开, 执行添加的操作 ContentValues values = new ContentValues(); values.put("name", name); int count = db.update("person", values, "_id = ?", new String[]{id + ""}); Log.i(TAG, "修改了: " + count + "行"); db.close(); // 数据库关闭 } } public List<Person> queryAll() { SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象 if(db.isOpen()) { String[] columns = {"_id", "name", "age"}; // 需要的列 String selection = null; // 选择条件, 给null查询所有 String[] selectionArgs = null; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值 String groupBy = null; // 分组语句 group by name String having = null; // 过滤语句 String orderBy = null; // 排序 Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy); int id; String name; int age; if(cursor != null && cursor.getCount() > 0) { List<Person> personList = new ArrayList<Person>(); while(cursor.moveToNext()) { // 向下移一位, 知道最后一位, 不可以往下移动了, 停止. id = cursor.getInt(0); name = cursor.getString(1); age = cursor.getInt(2); personList.add(new Person(id, name, age)); } db.close(); return personList; } db.close(); } return null; } /** * 根据id查询人 * @param id * @return */ public Person queryItem(int id) { SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象 if(db.isOpen()) { String[] columns = {"_id", "name", "age"}; // 需要的列 String selection = "_id = ?"; // 选择条件, 给null查询所有 String[] selectionArgs = {id + ""}; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值 String groupBy = null; // 分组语句 group by name String having = null; // 过滤语句 String orderBy = null; // 排序 Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy); if(cursor != null && cursor.moveToFirst()) { // cursor对象不为null, 并且可以移动到第一行 int _id = cursor.getInt(0); String name = cursor.getString(1); int age = cursor.getInt(2); db.close(); return new Person(_id, name, age); } db.close(); } return null; } }
事务的使用:
// 开启事务
db.beginTransaction();
// 标记事务成功
db.setTransactionSuccessful();
// 停止事务
db.endTransaction();
作者:大胖儿在努力
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。