zoukankan      html  css  js  c++  java
  • 基础学习总结(四)--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();

  • 相关阅读:
    P1908 逆序对
    P3834 【模板】可持久化线段树 1(主席树)
    BZOJ 4300: 绝世好题
    Codevs 2185【模板】最长公共上升子序列
    P1439 【模板】最长公共子序列
    P3865 【模板】ST表
    【转】良心的可持久化线段树教程
    Codevs 1299 切水果
    P3388 【模板】割点(割顶)&& 桥
    P3805 【模板】manacher算法
  • 原文地址:https://www.cnblogs.com/cuijl/p/4582311.html
Copyright © 2011-2022 走看看