zoukankan      html  css  js  c++  java
  • Android数据存储(三)——SQLite

    如果需要一个更加健壮的数据存储机制,则需要使用一个关系型数据库,在Android上,则为SQLlite。

    SQLite的特点:轻量级、嵌入式的、关系型数据库。可移植性好,易使用,小,高效且可靠,与使用它的应用程序共用一个进程空间。

    SQLite的缺点:不支持外键,需要手动利用触发器控制。

    我们先简单的进行SQLite的操作学习:

          9.3.1 数据库的创建和使用

        1.  SQLite的创建

        openOrCreateDatabase

    openOrCreateDatabase("mydatabase.db",

    SQLiteDatabase.CREATE_IF_NECESSARY,null);

    代码片段9.3.1.1 SQLite数据库创建

    注释:创建返回值为SQLiteDatabase,通过这个类,可以进行一系列的数据库操作,包括增删改查。

       

        2.  SQLite执行SQL

        SQLite可以直接执行SQL语句,不过它必须是执行语句,而非查询语句,因为它不会返回任何结果。

    this.sqLiteDatabase.execSQL(SQLStr.CREATE_USER_TABLE);

    代码片段9.3.1.2 执行SQL创建表

       

        注释:SQLStr.CREATE_USER_TABLE为数据库的建表语句:

    public static final String CREATE_USER_TABLE ="CREATETABLE user (id INTEGER PRIMARY KEY,name TEXT NOT NULL)";

    代码片段9.3.1.3 SQL建表语句

       

       

        3.  外键约束

        这个是重点需要注意的,因为SQLite(3.6.19)并不支持外键。所以,在使用外键的时候,必须要注意,需要手动创建触发器,在增加、修改、删除这三种情况下,执行定义的外键触发器才行。

        因为在Android2.3左右,使用的sqlite为3.6.19以上版本,也就是它会支持外键约束,所以这里的通过触发器来自定义外键就不再描述。

       

        4.  增加记录

        对于想表中增加数据,我们是通过建立一个ContentValues的对象,将需要插入的数据字段名和值进行配对写入。

    ContentValues values = new ContentValues();

          values.put("id", 1);

          values.put("name", "admin");

    this.sqLiteDatabase.insert("user",null, values);

    代码片段9.3.1.4 增加语句

        注释:insert语句有三个参数,分别代表为表名、values某列为空时插入的值、传入的列与值。

       

        5.  更新记录

        对于需要表中需要修改的数据,只需要将对应的列和修改后的值,保存到ContentValues就行。

    ContentValues contentValues = new ContentValues();

    contentValues.put("name", "guest");

    this.sqLiteDatabase.update("user", contentValues,"id=?", new String[]{"1"});

    代码片段9.3.1.5 更新语句

        注释:update有四个参数,分别对应为表明、需要更改的键值对、where字段、where字段对应的值

       

        6.  删除记录

        删除的操作也是类似。

    this.sqLiteDatabase.delete("user","id=?", new String[]{"1"});

    代码片段9.3.1.6 删除语句

       

        7.  查询记录

        查询是通过query这个方法来进行,这个方法会返回一个游标Cursor。

    while(cursor.moveToNext()){

    String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));

    String name =cursor.getString(cursor.getColumnIndex("name"));

    }  

    代码片段9.3.1.7 查询语句

        注释:上述就是一个简单的查询,通过游标的移动判断是否存在下一个,之后通过列名查得列号,再根据列号来获取该次循环所对应的列值。记住,每次查询完毕都需要关闭cursor,即cursor.close()

       

        一般查询的参数如下(由左向右):

    参数

    描述

    备注

    [String]

    执行查询的表名称

    [String Array]

    返回的列名称的列表

    可以使用null,表示全部返回

    [String]

    WHERE子语句

    可以使用null,即无条件查询,用“?”表示查询参数

    [String Array]

    查询参数的值

    当查询子语句为null时,必须为null

    [String]

    GROUP BY子句

    null表示无分组

    [String]

    HAVING子句

    当GROUP BY为null时,必须为null

    [String]

    ORDER BY子句

    如果为null,则表示使用默认排序

    [String]

    LIMIT子句

    为null,则表示无限制

    表9.3.1 查询语句参数表

       

        8.  复杂查询

       

        注意:对于复杂的查询,有一下两种方法,一种是通过SQLiteQueryBuilder类构建复杂查询;另一种是通过rawQuery执行原生sql语句查询。相对来说,rawQeruy的查询比SQLiteQueryBuilder简单

       

        SQLiteQueryBuilder:

    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();

    builder.setTables("user, info");

    builder.appendWhere("user.info=info.id");

               

    String[] returnColumns = {

          "user.id",

          "user.name",

          "info.sex"

       };

    String sortOrder = "user.id ASC";

     

    Cursor cursor = builder.query(this.sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);

    StringBuffer buffer = new StringBuffer();

    while(cursor.moveToNext()){

    String id = String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));

    String name =cursor.getString(cursor.getColumnIndex("name"));

    String sex =cursor.getString(cursor.getColumnIndex("sex"));

     

    buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+" ");

    }

    result.setText(buffer);

    cursor.close();

    代码片段9.3.1.8 SQLiteQueryBuilder语句

       

    注释:query的参数如下:

    参数

    描述

    备注

    [SQLiteDatabase]

    数据库

    用来查询的数据库实体

    [String Array]

    返回的列名数组

    [String]

    WHERE 子句

    查询条件

    [String Array]

    选择条件对应的值

    在条件为null是,必须为null

    [String]

    GROUP BY子句

    null表示无分组

    [String]

    HAVING子句

    当GROUP BY为null时,必须为null

    [String]

    SORT ORDER

    排序字段

    表9.3.2 query的参数表

       

        rawQuery:

    public static final String RAW_COMPLEX_QUERY ="SELECTuser.id,user.name,info.sex FROM user,info "

             + "WHEREuser.id=info.id ORDER BY user.id asc";

    代码片段9.3.1.9 原生查询语句

    Cursor cursor = this.sqLiteDatabase.rawQuery(SQLStr.RAW_COMPLEX_QUERY,null);

    StringBuffer buffer = new StringBuffer();

    while(cursor.moveToNext()){

    String id =

    String.valueOf(cursor.getInt(cursor.getColumnIndex("id")));

    String name =cursor.getString(cursor.getColumnIndex("name"));

    String sex =cursor.getString(cursor.getColumnIndex("sex"));

     

    buffer.append("[id:"+id+","+"name:"+name+","+"sex:"+sex+"]"+" ");

    }

    result.setText(buffer);

    cursor.close();

    代码片段9.3.1.10原生SQL调用语句

       

    注释:rawQuery的参数如下:

    参数

    描述

    备注

    [String]

    SQL语句

    [String Array]

    WHERE ARGS

    条件查询对应的值

    表9.3.3 rawQuery参数

       

       

          9.3.2 View中绑定数据

        上述了解了如何进行数据查询,现在可以通过Adapter适配器来进行数据的捆绑,让其在View中展示,而不是如上只是简单的显示。

    SQLiteQueryBuilder builder = newSQLiteQueryBuilder();

    builder.setTables("user, info");

    builder.appendWhere("user.info=info.id");

         

    String[] returnColumns = {

       "user.id as _id",

       "user.name",

       "info.sex"

    };

    String sortOrder = "user.id ASC";

         

    Cursor cursor = builder.query(sqLiteDatabase,returnColumns,null,null,null,null,sortOrder);

    startManagingCursor (cursor);

    ListAdapter adapter = new SimpleCursorAdapter (this, R.layout.activity_listitem, cursor,

    new String[]{"_id","name","sex"},

    new int[]{R.id.item_id,R.id.item_name,R.id.item_sex});

    this.listView.setAdapter(adapter);

    代码片段9.3.2.1 view中绑定数据

    注释:基本的查询在上面已经描述过,在绑定到Adapter适配器的时候,需要注意必须要有一个_id列,如果没有,可以通过别名将主键映射为_id

                案例:

                AndroidStudy_Database

                

  • 相关阅读:
    Python(2.7.6) 特殊方法
    Python(2.7.6) 列表推导式
    代码神注释鉴赏,喜欢拿去用
    为什么说重启能解决90%的问题
    为什么说重启能解决90%的问题
    编程语言简史
    编程语言简史
    Shell脚本中循环select命令用法笔记
    程序员职业规划
    程序员职业规划
  • 原文地址:https://www.cnblogs.com/james1207/p/3265447.html
Copyright © 2011-2022 走看看