Android之SQLite

SQLite是一种轻量级的数据库,支持结构化查询语言。
具有以下集合特点:

 1. 轻量级
 2. 独立性
 3. 隔离性
 4. 跨平台
 5. 多语言接口
 6. 安全性

SQLite能存储的数据类型和SQL Server 等数据库稍微有点不同,它具有以下几种数据类型:

 1. NULL:空值。 
 2. INTEGER:有符号整数,存储在1、2、3、4、6或8个字节中。 
 3. REAL:浮点数,存储为8字节的IEEE浮点数。
 4. TEXT:文本串,使用数据库编码(UTF-8, UTF-16BE或UTF-16LE)存储。
 5. DLOB:大块数据(二进制数据)

Android中SQLite的使用

首先,创建数据库
第一种方法:先创建一个数据库类,也就是创建一个类继承SQLiteOpenHelper类。
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,是系统提供的一个管理数据库表创建和版本管理(尤其是版本更新)的抽象类,我们必须通过继承SQLiteOpenHelper来实现自己的工具类。一般我们要重写三个方法,构造器、onCreate方法、onUpgrade方法。

它的部分方法描述:
  • SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int
    version) 构造方法:一般是传递一个要创建的数据库名称
  • onCreate(SQLiteDatabase db) 用于初次使用软件时生成数据库、表
  • onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新时调用,更新数据库表结构
  • getReadableDatabase() 创建或打开一个只读数据库
  • getWritableDatabase() 创建或打开一个读写数据库

当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。

public class DbHelper extends SQLiteOpenHelper {

    public DbHelper(Context context) {
        super(context, "user.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //创建表
        db.execSQL("create table t_user(_id integer primary key ,name text,sex text,image text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}

然后通过调用了、SQLiteOpenHelper类的 getWritableDatabase()方法来实现创建一个数据库。

DbHelper helper = new DbHelper(MainActivity.this);
SQLiteDatabase db = helper.getWritableDatabase();

创建数据库方法二:通过Context的OpenCreateDatabas()方法来创建数据库实例。
openOrCreateDatabase(name, mode, factory);
它的三个参数:

  • name:数据库名:可通过Context.getDatabasePath(“test.db”);获取保存路径,保存在/data/data/com.xxx.xxx/databases目录下。
  • mode:打开模式,共有六种,分别是:
    • MODE_APPEND
    • MODE_ENABLE_WRITE_AHEAD_LOGGING
    • MODE_MULTI_PROCESS
    • MODE_PRIVATE(这个是常用的)
    • MODE_WORLD_READABLE
    • MODE_WORLD_WRITEABLE
  • factory:游标工厂,我下面代码的是采用默认的,直接null
    public void createDatabase(View view) {
        // 先拿到SqliteDatabase对象实例、若数据库不存在则创建数据库
        SQLiteDatabase db = openOrCreateDatabase("QQ.db", MODE_PRIVATE, null);
        // 创建SQL语句
        String sql_create = "create table user(_id integer primary key  autoincrement, name text not null,password text)";
        // 执行SQL语句
        db.execSQL(sql_create);
    }

注意:像示例里那样创建表代码块只能创建一次,否则会报错表已存在)。

创建表SQL语句:CREATE TABLE 表名(字段名 字段类型,字段名2 字段类型)
CREATE TABLE if not exists tablename(); 如果表不存在,就创建
CREATE TABLE tablename(_id integer primary key autoincrement,name text not null,password text not null)
其中:

  • id integer primary key autoincrement: id字段作为主关键字段,并自增
  • primary key:主键关键字
  • autoincrement:自增

对表进行更、删、改、查等操作

我们可以通过SQLiteDatabase类为我们提供的方法进行操作,也可以通过SQL语句进行操作
SQLiteDatabase类为我们提供了很多种方法,较常用的方法如下:

  • (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语句,返回带游标的数据集

数据的添加:
1.通过execSQL方法

String sql_insertString =
         "insert into user(name,password) values('admin','123456')";
         db.execSQL(sql_insertString);

2、使用insert方法
insert(table, nullColumnHack, values);

  • 参数一:要插入数据的表名

  • 参数二:当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个
    列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入。

  • 参数三:ContentValues,存放键值对,键是对应数据库中的字段名
// 1.准备要插入的数据,放到ContentValues
        ContentValues values = new ContentValues();
        values.put("name", "张三丰");
        values.put("password", "123456");
        // 2.db.insert,返回的是当前插入的记录的id,如果是-1表示插入失败
        long insert = db.insert("user", null, values);

数据的更新:
在更新时如果不写条件,将会更改所有数据。
1.通过execSQL方法

 db.execSQL("update user set password='admin' where name='张三丰'");

2、使用update方法
update(table, values, whereClause, whereArgs);

  • 参数一:表名

  • 参数二:ContentValues,修改后的数据

  • 参数三:条件表达式

  • 参数四:满足条件表达式的值

ContentValues values = new ContentValues();
        values.put("password", "aaaaaa");
        //第四个参数为字符串数组
        //返回值为int表示该方法执行后影响多少条数据
        db.update("user", values, "_id=?", new String[]{"20"});

数据的删除:
1.使用execSQL方法

db.execSQL("delete from user where _id=1");

2.使用delete方法
delete(table, whereClause, whereArgs);

  • 参数一:表名

  • 参数二:条件表达式

  • 参数三:满足条件表达式的值

 db.delete("user", "_id>?", new String[]{"5"});

数据的查询:

1.SQL语句:SELECT * FROM user WHERE 条件
调用SQLDatabase的rawQuery方法,返回Cursor游标,并且游标指针指向的是第一条数据的前面。
rawQuery(sql, selectionArgs)

  • 第一个参数为select语句

  • 第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null

    // 查询数据
        String querySql = "SELECT * FROM user";
        Cursor cs = db.rawQuery(querySql, null);
        while (cs.moveToNext()) {
            Log.d("TAG", cs.getString(1));
        }

其中,cusor.getXxx(int 列号),如果不知道列号,可cs.getColumnIndex(“字段名”)获取列号。

2.SQLiteDatabase.query()
query(table, columns, selection, selectionArgs, groupBy, having, orderBy)

  • 参数一:String table 表名

  • 参数二:String[] columns 要返回的列,如果写null,将返回所有列,一般不建议这么写

  • 参数三: String selection 条件,可以写成 字段名=? ,如果有多条件,可用or或and:name=? or name=?

  • 参数四:String[]
    selectionArgs 条件满足的值,与参数三的个数要一一致,如果参数三是一个条件,则只有一个,如果参数三有多个值,则这里应该对应多个

  • 参数五: String groupBy 分组方式,若为空则不分组

  • 参数六:String having 分组滤过条件,必须与group by联用

  • 参数七:String orderBy 排序方式

Cursor cs = db.query("user", new String[] { "name", "password" },
                "name=?", new String[] { "张三丰" }, null, null, null);

查询结果Cursor的常用方法:

  • move(int offset) 按偏移量来移动

  • moveToLast () 将记录指针移动到最后一行

  • moveToNext () 将记录指针移动到下一行

  • moveToPosition(int position) 将记录指针移动到指定的一行

  • moveToPrevious() 将记录指针移动到上一行

  • getCount() 返回Cursor的行数

  • getColumnName(int index) 根据列的索引返回其相应的列名称

  • getColumnIndex(String name) 根据列的名字返回其相应的索引

  • getColumnNames() 返回一个保存有所有列名称的字符串数组

  • getColumnCount() 返回列的总数

  • close() 关闭游标结果集,释放资源

  • getType() 获取字段的数据类型。分别有0、1、2、3、4这几个结果

    • 0: 代表null
    • 1:代表int
    • 2:代表float
    • 3:代表String
    • 4:代表blob
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值