Android之SQLite

来源:互联网 发布:中标麒麟安装软件 编辑:程序博客网 时间:2024/06/05 11:54

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
0 0
原创粉丝点击