Skip to content

TangAnna/SQLiteDemo

Repository files navigation

SQLite的使用

SQLite数据库 数据库的种类有很多,在Android中我们使用SQLite这种嵌入式的数据库
特点:小型的、可嵌入、效率高、开源的、无数据类型、关系型数据库、程序驱动、支持事物操作

Android中的数据存储有五种方式:
1.SharedPreferences
2.文件存储
3.ContentProvider
4.数据库存储
5.网络存储
其中数据库存储的方式经常会用到,这里讲解一下使用方式,主要就是增、删、改、查的操作
在Android中有一个数据库辅助类SQLiteOpenHelper,使用要创建他的子类并重写其中了两个方法和一个构造方法
onCreate()方法

/**
     * 数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用
     * 作用:创建数据库 创建表
     *
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
      //TODO 一般是创建需要用到的表        
    }

onUpgrade()方法

/**
     * 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时)
     * 作用:更新数据库表结构
     * 注:创建SQLiteOpenHelper子类对象时,必须传入一个version参数,该参数 = 当前数据库版本,
     * 若该版本高于之前版本, 就调用onUpgrade()
     *
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 使用 SQL的ALTER语句
        String sql1 = "alter table student add age integer";
        db.execSQL(sql1);
    }

构造方法

/**
     * 构造方法
     *
     * @param context
     * @param name    数据库名称
     * @param factory 一个可选的游标工厂(通常是 Null)
     * @param version 当前数据库的版本,值必须是整数并且是递增的状态
     */
    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

SQLiteOpenHelper中有两个方法是获取SQLiteDatabase对象的,一个是getReadableDatabase()另一个是getWritableDatabase() 这两个方法从方法名称上看一个是获取可读的数据库,一个是获取可写入的数据库,但其实这两个方法发的真正含义是创建或者打开数据库, 这个数据库正常情况是可读可写的 只有在特殊情况下才分只可读 | 写(磁盘不足时 | 数据库限制了权限)

操作数据库时有两种方式:
1.直接写sql语句,使用SQLiteDatabase的execSQl(String sql)方法执行(推荐使用);
2.SQLiteDatabase给我们封装好了常用的API我们可以直接调用;

总结一下sql语句的使用
1.创建表

 create table 表名(字段名 数据类型 是否是主键 是否自增,字段名 数据类型,.....) 
 create table student (_id integer primary key,name varchar(32),age integer)

2.删除表

drop table 表名
drop table student

3.插入数据

insert into 表名 (字段名,字段名..) values(value1,value2...)
insert into student (_id,name) values(1,"小明")
insert into student values(1,"小明",18)//这省略掉前面字段名的方式后面的value值必须与表中的顺序相对应,并且是全部字段值

4.修改数据

update 表名 set 字段=新值 where 修改条件
update student set name="张三" where name="小明"

5.删除数据

delete from 表名 where 删除条件
delete from student where _id=1

6.查询数据

select 字段名(可多个中间用逗号隔开) from 表名 where 查询条件 group by 分组的字段 having 筛选条件 order by 排序字段
select * from 表名   //表示查询所有数据
select _id,name from student where age>18
select * from student
select * from student where _id<>2  //不等于
select * from student where _id=2 and age>20
select * from student where name like "%娜%"   //名字中包含娜的数据
select * from student where name is null  //姓名是空的数据
select * from student where age between 18 and 20  //年龄在18到20之间的数据
select * from student where age >18 order by age    //年龄大于18并且按照年龄排好序

API的使用方式:
1.插入

/**
     * @param table 表名
     * @param nullColumnHack 常使用null
     * @param values Key-value的map
     * @return the row ID of the newly inserted row, or -1 if an error occurred
     */
public long insert(String table, String nullColumnHack, ContentValues values) {
        
    }
   
ContentValues values = new ContentValues();
                values.put(Constant.STUDENT_NAME, "魏大勋API");
                values.put(Constant.STUDENT_AGE, "30");
                values.put(Constant.STUDENT_SEX, "男");
                db.insert("student", null, values);

2.删除

/**
     * @param table 表名
     * @param whereClause 条件
     * @param whereArgs 占位
     * @return 影响的行数
     */
public int delete(String table, String whereClause, String[] whereArgs) {
        
}
db.delete(Constant.TABLE_STUDENT_NAME, Constant.STUDENT_ID + "=?", new String[]{"5"});
db.delete(Constant.TABLE_STUDENT_NAME, Constant.STUDENT_ID + "=5", null);

3.修改

/**
     * @param 表名
     * @param values Key-value的map
     * @param whereClause 修改条件
     * @param whereArgs 占位
     * @return 
     */
    public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {

    }
    ContentValues values1 = new ContentValues();
                    values1.put(Constant.STUDENT_NAME, "白敬亭");
                    db.update(Constant.TABLE_STUDENT_NAME, values1, Constant.STUDENT_NAME + "=?", new String[]{"魏大勋"});

4.查询

/**
     * @param table 表名
     * @param columns 要查询的字段的数组
     * @param selection 查询条件
     * @param selectionArgs 占位
     * @param groupBy   分组字段
     * @param having    筛选条件
     * @param orderBy 排序字段
     * @return Cursor
     */
    public Cursor query(String table, String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,
            String orderBy) {

    }
    Cursor cursor = db.query("student", new String[]{"_id", "name", "sex"}, null, null, null, null, null);

Cursor的使用:
cursor在Android中是查询数据后得到的一个管理数据集合的类,cursor位于android.database包下面, 可见他的设计就是为数据库使用的。使用SQLiteDatabase.query()方法时就会得到Cursor对象,再根据需求对cursor处理 去除自己需要的数据;
使用Cursor时如果数据量不大不会造成内存问题,但是如果数据量大的时候会有问题,不要想着要GC处理而是要开发者手动调用cursor.close(); 方法关闭游标释放资源;
Cursor的常用方法:

cursor.moveToFirst();   //移动到第一行
cursor.moveToLast();    //移动到最后一行
cursor.moveToNext();    //移动到下一行
cursor.move(int offset);    //一当前位置为基准移动到指定位置
cursor.moveToPosition(int position);    //移动到指定行
Cursor.moveToPrevious();    //移动到前一行
Cursor.isFirst();   //是否是指向第一行
Cursor.isLast();    //是否是指向最后一行
Cursor.isBeforeFirst();     //是否指向第一行之前
Cursor.isAfterLast();   //是否指向最后一行之后
Cursor.isNull(int columnIndex);     //指定列是否为空
Cursor.isClosed();  //游标是否关闭
Cursor.getCount();  //获取总数
Cursor.getPosition();   //当前游标的行标
Cursor.getColumnIndex(String columnName);   //获取列名对应的索引值
Cursor.getString(int columnIndex);  //获取当前行指定列的值
Cursor.close(); //关闭游标,释放资源
Cursor.getColumnIndexOrThow(String columnName); //从零开始返回列名对应的索引值不存在的话抛出IllegalArgumentException异常

Cursor的遍历方式:

if(cursor!=null&&cursor.moveToFirst()){
      do{
      }while(cursor.moveToNext);
}

或者

if(cursor!=null&&cursor.moveToFirst()){
       while (!cursor.isAfterLast()) {

      }
}

About

SQLite数据库的使用

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages