• Android 学习心得(2)——Android内置数据库SQLite


     一、简介

       Android有一个内置数据库SQLite,它是一种轻型数据库,它有五种数据类型:NULL(空型)、BLOB(二进制)、INTEGER(整型)、REAL(浮点型)、TEXT(字符串文本),虽然有着五种数据之分,但是在内部SQLite存储数据是无类型的,也就是说你可以在integer中存入char数据之类的。

       二、要点:

    • INTEGER PRIMARY KEY中只能存放64位整数
    • 在编写CREATE TABLE时候可以省略字段后面的数据类型
    • SQLite中可以解析大部分标准SQL语句
    • 插入语句:insert into 表名 (字段名1,字段名2..) value (值1,值2,..)
    • 删除语句:delete from 表名 where 条件子句
    • 修改语句:update 表名 set 字段名1=值1,字段名2=值2 where 条件子句
    • 查询语句:select * from 表名 where 条件子句 group by 分组子句

     三、常用类简介

    ————————————————————————————————————————————————————————————————————

        1、SQLiteOpenHelper抽象类属于SQLiteDatabase的帮助类,一般的用法是定义一个类继承SQLiteOpenHelper,并实现两个回调方法,OnCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabse, int oldVersion, int newVersion)来创建和更新数据库

    SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) 构造方法(上下文对象,数据库文件名称,游标工厂,数据库版本号)(游标工厂传入null使用默认提供的游标)
    onCreate(SQLiteDatabase db) 数据库创建时候调用                
    onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 数据库更新是被调用(数据库连接实体,旧版本号,新版本号)
    getReadableDatabase(),getWritableDatabase() 创建或打开一个只读/可读写的数据库(前者不会检查数据库是否可以被写,后者会检查数据库能否写)

      

        2、SQLiteDatabase类用于管理和操作SQLite数据库,几乎所有的数据库操作,最终都将由这个类完成。

    (返回值)方法名方法描述
    (int) delete(String table,String whereClause,String[] whereArgs) 删除数据行的便捷方法
    (long) insert(String table,String nullColumnHack,ContentValues values) 添加数据行的便捷方法
    (int) update(String table, ContentValues values, String whereClause, String[] whereArgs) 更新数据行的便捷方法
    (void) execSQL(String sql) 执行一个SQL语句,可以是一个select或其他的sql语句
    (void) close() 关闭数据库
    (Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 查询指定的数据表返回一个带游标的数据集
    (Cursor) rawQuery(String sql, String[] selectionArgs) 运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别就是防止SQL注入)

    数据的添删改查分别可以通过2种途径来实现

    数据的添加

    1.使用insert方法

    1 ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据cv.put("username","Jack Johnson");//添加用户名
    2 cv.put("password","iLovePopMusic"); //添加密码
    3 db.insert("user",null,cv);//执行插入操作
     

    2.使用execSQL方式来实现

    1 String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句
    2 db.execSQL(sql);//执行SQL语句
     

    数据的删除

    同样有2种方式可以实现

    1 String whereClause = "username=?";//删除的条件
    2 String[] whereArgs = {"Jack Johnson"};//删除的条件参数
    3 db.delete("user",whereClause,whereArgs);//执行删除


    使用execSQL方式的实现

    1 String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句
    2 db.execSQL(sql);//执行删除操作

    数据修改

    1 ContentValues cv = new ContentValues();//实例化ContentValues
    2 cv.put("password","iHatePopMusic");//添加要更改的字段及内容
    3 String whereClause = "username=?";//修改条件
    4 String[] whereArgs = {"Jack Johnson"};//修改条件的参数
    5 db.update("user",cv,whereClause,whereArgs);//执行修改

    使用execSQL方式的实现

    String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL语句
    db.execSQL(sql);//执行修改

    数据查询

    数据查询相对前面几种方法就复杂一些了,因为查询会带有很多条件

    通过query实现查询的

    public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

    各参数说明:

    • table:表名称
    • colums:列名称数组
    • selection:条件子句,相当于where
    • selectionArgs:条件语句的参数数组
    • groupBy:分组
    • having:分组条件
    • orderBy:排序类
    • limit:分页查询的限制
    • Cursor:返回值,相当于结果集ResultSet

    针对游标(Cursor)也提供了不少方法

    方法名称方法描述
    getCount() 总记录条数
    isFirst() 判断是否第一条记录
    isLast() 判断是否最后一条记录
    moveToFirst() 移动到第一条记录
    moveToLast() 移动到最后一条记录
    move(int offset) 移动到指定的记录
    moveToNext() 移动到吓一条记录
    moveToPrevious() 移动到上一条记录
    getColumnIndex(String columnName) 获得指定列索引的int类型值

    实现代码
    1
    Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标 2 if(c.moveToFirst()){//判断游标是否为空 3 for(int i=0;i<c.getCount();i++){ 4 c.move(i);//移动到指定记录 5 String username = c.getString(c.getColumnIndex("username"); 6 String password = c.getString(c.getColumnIndex("password")); 7 } 8 }

    通过rawQuery查询

    Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});
    if(cursor.moveToFirst()) {
        String password = c.getString(c.getColumnIndex("password"));
    }

    分割线内内容整理自涂文瀚博客:http://www.cnblogs.com/Excellent/archive/2011/11/19/2254888.html

     ——————————————————————————————————————————————————————————————————————

    student.java实体类

    public class student {
        private Integer id;
        private String name;
        private String gender;
        private Integer age;
        public student(Integer id, String name, String gender, Integer age) {
            this.id = id;
            this.name = name;
            this.gender = gender;
            this.age = age;
        }
        public student(){
            
        }
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        
    }

    service类继承自SQLiteOpenHelper

    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class service extends SQLiteOpenHelper{
        public service(Context context) {
            super(context, "student.db", null, 1);//(上下文对象,数据库名称,游标工厂[null表示使用系统默认的游标工厂],数据库版本号)
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            //sqlite每次创建的时候调用
            db.execSQL("create tab student(id integer primary key autoincrement ,name char(20),gender char(4),age integer)");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
            //sqlite每次版本升级的时候调用
            db.execSQL("alter tab student add tel varchar(20)");
            
        }
    }

    sqlliteService类具体的增删改查方法

    package com.example.service;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import com.example.pojo.student;
    
    public class sqliteService {
        service service;
        public sqliteService(Context context) {
            //构造方法传递上下文对象
            service = new service(context);
        }
    
        public void save(student student) {//增加数据的方法
            SQLiteDatabase db=service.getWritableDatabase();//获取数据实体//写方法//会判断是否数据库已经满了
            String sql=" insert into student('name','gender','age')value (?,?,?)";//
            db.execSQL(sql, new Object[]{student.getName(),student.getGender(),student.getAge()});//执行sql语句?由数组提供
            db.close();
        }
    
        public void delete(int id) {//删除数据的方法
            SQLiteDatabase db=service.getWritableDatabase();
            String sql = "delete from student where id=?";
            db.execSQL(sql, new Object[]{id});
            db.close();
        }
    
        public void update(student student) {//修改数据的方法
            SQLiteDatabase db=service.getWritableDatabase();
            String sql = "update student set name=? ,gender=?,age=? where id=?";
            db.execSQL(sql,new Object[]{student.getName(),student.getGender(),student.getAge(),student.getId()});
            db.close();
        }
    
        public student find(int id) {//单条查询的方法
            student student=null;
            SQLiteDatabase db=service.getWritableDatabase();
            String sql = "select * from student where id=?";
            Cursor cursor= db.rawQuery(sql,new String[]{String.valueOf(id)});
            if(cursor.moveToFirst()){
                int id2 =cursor.getInt(cursor.getColumnIndex("id"));
                String name=cursor.getString(cursor.getColumnIndex("name"));
                String gender=cursor.getString(cursor.getColumnIndex("gender"));
                int age=cursor.getInt(cursor.getColumnIndex("age"));
                student=new student(id2,name,gender,age);
            }
            db.close();
            return student;
        }
    
        public List<student> findByPage(int min,int page) {//查询分页数据的方法
            List<student> list = new ArrayList<student>();
            SQLiteDatabase db=service.getReadableDatabase();
            String sql = "select * from student group by desc limit ?,?";
            Cursor cursor= db.rawQuery(sql,new String[]{String.valueOf(min),String.valueOf(page)});
            while(cursor.moveToNext()){
                int id2 =cursor.getInt(cursor.getColumnIndex("id"));
                String name=cursor.getString(cursor.getColumnIndex("name"));
                String gender=cursor.getString(cursor.getColumnIndex("gender"));
                int age=cursor.getInt(cursor.getColumnIndex("age"));
                list.add(new student(id2,name,gender,age));
            }
            db.close();
            return list;
        }
    
        public int getCount() {//统计数据条数
            SQLiteDatabase db=service.getReadableDatabase();
            String sql="select count(*) from student";
            int count=db.rawQuery(sql,null).getCount();
            db.close();
            return count;
        }
    
    }
  • 相关阅读:
    day 66 ORM django 简介
    day 65 HTTP协议 Web框架的原理 服务器程序和应用程序
    jQuery的事件绑定和解绑 事件委托 轮播实现 jQuery的ajax jQuery补充
    background 超链接导航栏案例 定位
    继承性和层叠性 权重 盒模型 padding(内边距) border(边框) margin 标准文档流 块级元素和行内元素
    属性选择器 伪类选择器 伪元素选择器 浮动
    css的导入方式 基础选择器 高级选择器
    03-body标签中相关标签
    Java使用内存映射实现大文件的上传
    正则表达式
  • 原文地址:https://www.cnblogs.com/lingzhishitu/p/4381584.html
Copyright © 2020-2023  润新知