Android 开发中使用 SQLite 数据库

SQLite 介绍

  SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。

    此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.

  SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。

  SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。

 SQLite 内部结构

图 1. SQLite 内部结构

 

原文 http://www.ibm.com/developerworks/cn/opensource/os-cn-sqlite/index.html  


 

 

SQLite的优点:

  1. 轻量级

    使用 SQLite 只需要带一个动态库,就可以享受它的全部功能, 而且那个动态库的尺寸想当小。
  2. 独立性

    SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
  3. 隔离性

    SQLite 数据库中所有的信息(比如表、视图、触发器等) 都包含在一个文件夹内,方便管理和维护。
  4. 跨平台

    SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统 也是能够运行,比如:Android。
  5. 多语言接口

    SQLite 数据库支持多语言编程接口。
  6. 安全性

    SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。 这意味着多个进程可以在同一时间从同一数据库读取数据, 但只能有一个可以写入数据。

 

 

 

在Android中连接SQLite需要先创建一个类,并且继承个类extends SQLiteOpenHelper

package com.example.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper extends SQLiteOpenHelper {

    /**
     * @param context    上下文
     * name: 数据库的名字
     * factory 目的创建 cursor 对象
     * version 数据库的版本  从1开始
     */
    public MyOpenHelper(Context context) {
        super(context, "itheima.db", null, 1);
//        super(context, name, factory, version);
    }

    /**
     * Called when the database is created for the first time. This is where the creation of tables and the initial population of the tables should happen.
     * 当数据库第一次创建的时候调用
     * 那么这个方法特别适合做表结构的初始化    创建表就是写 sql 语句
     */
    public void onCreate(SQLiteDatabase db) {
        // id 一般以  _d  下划线开头
        String  sql ="create table wx_user(" +
                "id int primary key," +
                "name varchar(30)," +
                "tou varchar(20)," +
                "content varchar(50)," +
                "dateTime varchar(30)" +
                ")";
      db.execSQL(sql);
    }

    /**
     * Called when the database needs to be upgraded. 
     * 当数据库版本升级的时候调用
     * 这个方法适合做什么    表结构的更新
     *  
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table info add phone varchar(20)");
    }

}
MyOpenHelper

 

 这里创建了数据库类,接下来是往数据库中插入数据;

    //方法一
    // 创建数据库
        MyOpenHelper helper = new MyOpenHelper(this);
        SQLiteDatabase db = helper.getWritableDatabase();

        // ContentValues 其实是一个map 对象 google 工程师封装的方法
        ContentValues values = new ContentValues();

        // 一一对应填充数据
     values.put("id",1);
        values.put("name", "android");
        values.put("tou", "xxx");
        values.put("content", "今天学习了SQLite");
        values.put("dateTime", "11月29号");

        db.insert("t_Message", null, values);
        // 方法二:使用sql 语句
        String sql = "insert into t_Message(id,name,tou,content,datetime) values(?,?,?,?,?)";
        //
        String[] sqlVales = {2, "oracle", "aaa", "oracle快忘记了", "11月20日" };
        db.execSQL(sql, sqlVales);
        // 关闭数据库连接
        db.close();
插入数据一

 
// 方法三
//往数据库中插入数据的代码,在这里使用的是execSQL(sql);
for(int i=3;i<20;i++){
            String sql = "insert into wx_user(id,name,tou,content,dateTime) values("+i+",'oracle"+i+"','aa','oracle是什么','11月19日')";
            sqlDatabase.execSQL(sql);
}
插入数据三

 

往数据库中参入数据之后,我们再将数据库中的数据取出来看看;我们需要先创建一个实体类;

package com.example.entiy;

// 创建实体类
public class unserInFo { 
    private int id;
    private String name;
    private String dateTime;
    private String tou;
    private String content;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDateTime() {
        return datetime;
    }
    public void setDateTime(String dateTime) {
        this.dateTime= dateTime;
    }
    public String getTou() {
        return tou;
    }
    public void setTou(String tou) {
        this.tou = tou;
    }
    public String toString() {
        return "unserInFo [id="+id+,"name=" + name + ", dataTime=" + dataTime+ ", tou=" + tou+ "]";
    }
    public unserInFo() {
        super();
    }
    
}
创建实体类

 

获取数据

//定义一个集合用来存放所有的结果
List<unserInFo> user = new ArrayList<unserInFo>();
//通过游标来获取表wx_user的信息,
Cursor c=sqlDatabase.query("wx_user", null, null, null, null, null, null);
        //先判断是否有第一条数据(ic.moveToFirst()将游标移到第一条数据,如果没有第一条数据则返回false,否则返回true)
       if(c.moveToFirst()){
                //通过getCount()来决定循环的次数getCount()是游标的总数量。
        for (int i = 0; i<c.getCount();i++) {
            unserInFo uif = new unserInFo();
            
            //将游标移动到下一条数据
            c.moveToNext();
            uif.setId(c.getInt(c.getColumnIndex("id")));
            uif.setLastdate(c.getString(c.getColumnIndex("dateTime")));
            uif.setName(c.getString(c.getColumnIndex("name")));
            uif.setZhao(c.getString(c.getColumnIndex("tou")));
            uif.setContent(c.getString(c.getColumnIndex("content")));
            user.add(uif);
            
        }
}    
//最后数据库中获取到的数据就全部存放到user集合中了,我们只需要遍历user就能显示数据了。
获取数据

 

 

SQLiteOpenHelper是SQLiteDatabase的一个帮助类, 用来管理数据库的创建和版本的更新。

一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。 常用的方法有:

onCreate(SQLiteDatabase db)

创建数据库时调用

onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion)

版本更新时调用 

getReadableDatabase()

创建或打开一个只读数据库 

getWritableDatabase() 

创建或打开一个读写数据库

 

 

 

 

 

 

 

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

(与上面的语句最大的区别就是防止SQL注入)

 

 

 

 

 

 

 

 

 

 

 

2.SQLiteDatabase类

使用insert方法

ContentValues cv = new ContentValues();  // 实例化一个ContentValues用来装载待插入的数据

cv.put("username","Jack Johnson");     // 添加用户名

cv.put("password","iLovePopMusic");      // 添加密码

db.insert("user",null,cv);            // 执行插入操作
实例化一个ContentValues

  

使用execSQL方式来实现

String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');  //插入操作的SQL语句

db.execSQL(sql);  //执行SQL语句
插入SQL语句

 

数据的删除

String whereClause = "username=?";    // 删除的条件

String[] whereArgs = {"Jack Johnson"};    // 删除的条件参数

db.delete("user",whereClause,whereArgs);   // 执行删除 

String sql = "delete from user where username='Jack Johnson'";  // 删除操作的SQL语句

db.execSQL(sql);  // 执行删除操作
删除语句

 

数据修改

ContentValues cv = new ContentValues();      // 实例化

ContentValues cv.put("password","iHatePopMusic"); // 添加要更改的字段及内容

String whereClause = "username=?";        // 修改条件

String[] whereArgs = {"Jack Johnson"};        // 修改条件的参数

db.update("user",cv,whereClause,whereArgs);    // 执行修改 

String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'";  // 修改的SQL语句

db.execSQL(sql);    // 执行修改
更改

 

数据查询

通过query实现查询的

public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

table

表名称

column

列名称数组

selection

条件子句,,相当于where 

selectionArgs

条件语句的参数数组

groupBy

分组

having

分组条件

orderBy

排序类

limit

分页查询的限制

Cursor

返回值,相当于结果集resultSet

 

 

 

 

 

 

 

 

 

 

 

 

 

 

游标(Cursor)

getCount()

总记录条数

isFirst()

判断是否第一条记录

isLast()

判断是否最后一条记录

moveToFirst()

移动到第一条记录

moveToLast()

移动到最后一条记录

move(int offset)

移动[是指偏移量而不是指移到指定位置]

moveToNext()

移动到吓一条记录

moveToPrevious()

移动到上一条记录

getColumnIndex(String columnName)

获得指定列索引的int类型值

   

 

 

 

 

 

 

 

 

 

 

 

 

 

复制代码
游标(Cursor)
Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标
if(c.moveToFirst()){//判断游标是否为空
    for(int i=0;i<c.getCount();i++){
        c.moveToNext();
        String username = c.getString(c.getColumnIndex("username");
        String password = c.getString(c.getColumnIndex("password"));
    }
复制代码

rawQuery实现的带参数查询

Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});
if(cursor.moveToFirst()) {
    String password = c.getString(c.getColumnIndex("password"));
}

 

   http://www.cnblogs.com/shanyou/archive/2007/01/08/615245.html  

 

posted @ 2016-11-30 11:20  Seven-7-  阅读(246)  评论(0编辑  收藏  举报