基础学习总结(四)--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 }
View Code

使用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 }
View Code

使用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();

原文地址:https://www.cnblogs.com/cuijl/p/4582311.html