zoukankan      html  css  js  c++  java
  • Android 数据库

    一、SQL基础

    一个数据库通常包含一个或多个表,每个表由一个名字标识,表包含带有数据的记录(行)。

    一下是一个名为“Persons”的表(包含两条记录和五个列):

    Id LastName FirstName Address City
    1 Adams John address1

    city1

    2 Bush George address2 city2

    在数据库上的大部分错做都由Sql语句完成。

    select LastName from Persons

    结果集:

    LastName
    Adams
    Bush

    注:SQL语句对大小写不敏感。

    可以把SQL分为两个部分:数据库操作语言(DML)和数据库定义语言(DDL)

    查询和更新指令构成了SQL的DML部分:

    select -从数据库获取数据

    update -更新数据库表中的数据

    delete -从数据库删除数据

    insert into -向数据库表中插入数据

    SQL中最重要的DDL语句:

    create database -创建数据库

    alert database -修改数据库

    create table -创建新表

    alert table -变更(改变)数据库表

    drop table -删除表

    create index -创建索引(搜索键)

    drop index -删除索引

    select语句

    select语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。

    select 列名称 from 表名称  或 select 列名称1,列名称2,.. from 表名称

    以及

    select * from 表名称(这个是获取表名为表名称的所有列的数据,*为获取所有列的快捷方式)

    select disdinct语句用于返回唯一不同的值

    select distinct 列名称 from 表名称

    SQL where子句(如有条件的从表中选取数据,可将where子句添加到select语句)

    select 列名称 from 表名称 where 列 运算符 值

    下面的运算符可在where子句中使用:

    操作符 描述
    = 等于
    <> 不等于
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    between 在某个范围内
    like 搜索某种模式

    例如:获取居住在城市“city1”中的人:

    select * from Persons where City=‘city1’

    注意:SQL用单引号来环绕文本值(大部分数据库系统也接受双引号),如果是数值,请不要用引号。

    //正确
    select * from Persons where FirstName = 'bush'
    //错误
    select * from Persons where Year>'1965'

    SQL and & or 运算符(可以在where子语句中把两个或多个条件结合起来)

    如果第一个条件和第二个条件都成立,则and显示一条记录

    如果第一个条件和第二个条件中只要有一个成立,则or运算符显示一条记录

    SELECT * from Persons WHERE firstname='John' OR lastname='Carter'
    SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
    AND LastName='Carter'

    SQL order by子句(用于根据指定的列结果集进行排序)

    默认按照升序对记录进行排序(ASC),降序(DESC)

    //以字母顺序显示公司名称
    SELECT Company, OrderNumber FROM Orders ORDER BY Company
    //以字母顺序显示公司名称,兵役数字顺序显示顺序号
    SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
    //以逆字母顺序显示公司名称
    SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
    //以逆字母顺序显示公司名,并以数字顺序显示顺序号
    select Company,OrderNumber from 表名 orders by Company desc,OderNumber ASC

    SQL insert into语句

    用于向表格中插入新的行

    insert into 表名称 values (值1,值2,...)

    也可以指定索要插入数据的列:

    insert into 表名称(列1,列2,...) values (值1,值2,...)

    SQL update 语句

    用于修改表中的数据。

    update 表名称 set 列名称 = 新值 where 列名称 = 某值

    SQL delete语句

    用于删除表中的行

    delete from 表名称 where 列名称 = 值

    SQL 通配符:

    通配符 描述
    % 替代一个或多个字符
    _ 仅替代一个字符
    [charlist] 字符列中的任何单一字符
    [^charlist]或者[!charlist] 不在字符列中的任何单一字符
    //从 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人
    SELECT * FROM Persons WHERE City LIKE 'Ne%'
    //从 "Persons" 表中选取居住在包含 "lond" 的城市里的人
    select * from Persons where City like '%lond%'
    //从 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人
    select * from Persons where FirstName like '_eorge'
    //从 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人
    select * from Persons where City like '[ALN]%'

    二、使用SQLiteOpenHelper对数据库进行版本管理

    SQLiteOpenHelper类的构造方法:

    所有继承了这个类的类都必须实现下面这样一个构造方法:

    public DatabaseHelper(Context context,String name,CursorFactory factory,int version)
    //第一个参数:Context类型,上下文对象
    //第二个参数:String类型,数据库的名称
    //第三个参数:CursorFactory类型
    //第四个参数:int类型,数据库版本
    //注意:数据库名称只需要写数据库名就可以,会自动把数据库存入到app的目录下
    //    CursorFactory一般使用null即可

    SQLiteOpenHelper类提供了两个方法:

    onCreate(SQLiteDataBase db ):用于初次使用软件时生成数据库列表,一般在这个方法中创建数据的相应表

    onUpgrade(SQLiteDatabsse db, int oldVersion ,int newVersion):用于升级软件时更新数据库表结构

    当调用getReadableDatabase或者getWriteableDatabase方法时才真正创建数据库,返回一个数据库对象,数据库存储到了data/data/包名/databases。

    getReadableDatabase()创建或者打开一个可读写的数据库,如果出现问题(磁盘满等),则打开一个只读的数据库,而getWriteableDatabase()获得一个可读写的数据库,如果磁盘满会抛出异常。

    三、使用SQLiteDataBase操作SQLite数据库

    应重点掌握execSQL()和rawQuery()方法。

    execSql()方法可以执行insert、delete、update和create table之类有更改行为的SQL语句,没有返回值,rawQuery()方法用于执行查询语句。

    示例:

    SQLiteDataBase db = this.getReadableDatabase();
    //一般不用这个
    //db.execSQL("insert into person(name,age) values ('aa',4)");
    //推荐
    db.execSQL("insert into person(name,age) values(?,?)",new Object[] {"aa",4});
    db.close();

    db.execSQL(String sql,Object[] bindArgs)方法,第一个参数为SQL语句,第二个参数为SQL语句中占位符的位置,参数值在数组中的位置要和占位符对应。

    Cursor cursor = db.rawQuery("select * from person",null);
    while (cursor.moveToNext()){
        int personid = cursor.getInt(0);//获取第一列的值,索引从0开始
        String name = cursor.getString(1);
    }
    cursor.close();
    db.close();

     关于Cursor:

    当执行查询语句的时候,返回值是一个Cursor对象,Cursor也提供了一些方法来移动查询结果的记录指针。

    1.move(int offset)  //讲治镇吸纳上或向下移动指定的行数,offset是整数就是向下,负数就是向上
    2.moveToFirst()  //移动到第一行,成功则返回true
    3.moveToLast()  //移动到最后一行
    4.moveToNext()  //移动到下一行
    5.moveToPosition(position) //移动到指定的行
    6.moveToPrevious()  //向上移动一行
    7.一旦将记录指针移动到指定行后,接下来就可以调用Cursor对象的getXXX()了方法来获得该行的记录了
    //返回一个字符串数组的列名
            String[] arrColumnName = cursor.getColumnNames();
            while (cursor.moveToNext()) {
                Map<String, Object> map = new HashMap<String, Object>();
                for (int i = 0; i < arrColumnName.length; i++) {
                    Object colume_value = null;
                    //cursor.getType()返回光标的类型
                    switch (cursor.getType(i)) {
                        case 1:
                            colume_value = cursor.getInt(i);
                            break;
                        case 2:
                            colume_value = cursor.getFloat(i);
                            break;
                        case 3:
                            colume_value = cursor.getString(i);
                            break;
                        case 4:
                            colume_value = cursor.getBlob(i);
                            break;
                        default:
                            break;
                    }
                    map.put(arrColumnName[i], colume_value);
                }
                list.add(map);
            }
  • 相关阅读:
    UI
    最长回文子串
    LRU缓存机制
    环形链表 II
    环形链表
    买卖股票的最佳时机 II
    [CSP-S模拟测试]:连连看(图论+容斥)
    [CSP-S模拟测试]:集合论(模拟)
    [CSP-S模拟测试]:位运算(数学)
    [CERC2016]:凸轮廓线Convex Contour(模拟+数学)
  • 原文地址:https://www.cnblogs.com/chhom/p/4754914.html
Copyright © 2011-2022 走看看