一. 简介
SQLite数据库是一个轻量级的DBMS(数据库管理系统)。SQLite使用单个文件存储数据,Android标准库包含SQLite库以及配套使用的一些Java辅助类。主要特点:轻量级,单一文件,跨平台,开源。

二. Android中SQLite数据库的使用

  1. 创建SQLite数据库

    SQLiteDatabase db=SQLiteDatabase.openOrCreateDatabase("/data/data/" + getPackageName() + "/test.db", null);

    执行完这条语句,可以在adb shell下进入/data/data/package-name/下看到刚才创建的数据库文件

    在Android中使用SQLiteDatabase的静态方法
    openOrCreateDatabase(String path,
    SQLiteDatabase.CursorFactory factory)打开或者创建一个数据库。
    它会自动去检测是否存在这个数据库,如果存在则打开,反之不存在就创建一个数据库;创建成功则返回一个SQLiteDatabase对象,失败抛出FileNotFoundException异常。


除了以上方法,Android还提供了SQLiteOpenHelper这个类来创建数据库,首先继承SQLiteOpenHelper,重写onCreate和onUpgrade方法及构造方法

public class MySqliteHelper extends SQLiteOpenHelper{    public MySqliteHelper(Context context) {        super(context, "mysqlite.db", null, 1);        //传入四个参数        //第一个参数context 上下文对象        //第二个参数mysqlite.db 数据库名称(文件名)        //第三个参数一般为null        //第四个参数数据库版本号,这里写1    }    @Override    public void onCreate(SQLiteDatabase db) {/* 数据库创建的时候会回调此方法,可以用db对象执行SQL语 * 句,创建所需要的表 */    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//当数据库升级时调用此方法    }}

接着在需要创建数据库的时候调用

SQLiteOpenHelper dbHelper = new MySqliteHelper(this);SQLiteDatabase db = dbHelper.getWritableDatabase();

使用SQLiteOpenHelper创建的数据库,保存在/data/data/package-name/databases/目录下,通过adb shell可以看到创建的数据库文件

  1. 创建数据库中的数据表
    数据库创建完成后,要创建保存数据的表,表是存放在数据库中的。示例代码入下

    private void createTable(SQLiteDatabase db){//SQL语句String sql = "create table stutable(_id integer primary key autoincrement,name text,age integer)";db.execSQL(sql);}

    这里附上SQLite数据类型
    NULL: 这个值可为空值
    VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
    CHAR(n):长度固定为n的字串,n不能超过 254。
    INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8…
    REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
    TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
    BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改变格式。
    DATA :包含了 年份、月份、日期


    执行完上述语句,可以通过ADM将数据库文件导出到电脑上

    通过可视化工具打开数据库文件可以看到之前创建的表,以及定义的表字段

    除了执行定义创建表的方法外,还可以在继承SQLiteOpenHelper类中的onCreate方法来初始化表结构,在后面的例子使用继承SQLiteOpenHelper方式创建表。

  2. 对表进行操作(数据表的增删改查)
    增:在表中增加数据,可以使用SQLiteDatabase类中提供的execSQL(String sql)执行一条插入数据的SQL语句来插入数据,不过,AndroidSQLiteDatabase类提供了更为简单的方法来执行插入数据操作

    //SQLiteDatabase类中提供的方法   public long insert(  String table,//要操作表名       String nullColumnHack,//空列的默认值   ContentValues values//ContentValues封装了列名称和列值的Map  ); 
    private void insertToTable(SQLiteDatabase db){ContentValues cv = new ContentValues();cv.put("name","wxq");cv.put("age",11);db.insert("stutable",null,cv);}

    执行insertTable方法,再次导出数据库可以看到stutable表中增加了一条数据


    删:好吧,刚插入一条数据。。。
    同样Android提供了delete方法

    //SQLiteDatabase类中提供的方法public int delete(   String table,//表名称   String whereClause,//删除条件   String[] whereArgs); //删除条件值数组
    private void deleteToTable(SQLiteDatabase db){//删除条件,这里以name为条件,也可以是age = ?String whereClasuse = "name = ?";//删除条件参数,String[] whereArgs = new String[]{"wxq"};//执行删除db.delete("stutable",whereClasuse,whereArgs);}

    执行上述语句,将会删除stutable表中刚才插入的数据。


    改:

    //SQLiteDatabase类中提供的方法public int update(//表名称String table,//和行列ContentValues键值对应的key-valueContentValues values,//更新条件String whereClause,//更新条件数组String[] whereArgs);
    private void updateToTable(SQLiteDatabase db){//实例化ContentValuesContentValues cv= new ContentValues();cv.put("age",23);//更新条件String whereClause = "name = ?";//更新条件数组String[] whereArgs = new String[]{"wxq"};db.update("stutable",cv,whereClause,whereArgs);}

    执行完更新语句,导出数据库文件,在可视化工具中查看


    查:在Android中查询数据是通过Cursor类来实现的,可以使用SQLiteDatabase.query()方法时,这里使用别一个方法rawQuery

    public Cursor rawQuery(String sql,//查询的SQL语句String[] selectionArgs//当SQL语句中含有?,这里代表值);
    public void queryToTable(SQLiteDatabase db){String sql = "select * from stutable";//全查Cursor c = db.rawQuery(sql,null);//这里会返回一个Cursor(游标)对象}

  3. 使用SQLite的一个Demo(英雄管理系统)

    主要操作数据库的代码

public class HeroSqliteManager {    private SQLiteOpenHelper dbHelper;    private SQLiteDatabase db;    private static HeroSqliteManager instance;    private static final String TABLE_NAME = "hero";    private static final String NAME_FIELD = "name";    private static final String ICOID_FIELD = "icoId";    private static final String ATTACK_FIELD = "attack";    private static final String DEFENSE_FIELD = "defense";    public static HeroSqliteManager getInstance() {        if (instance == null) {            synchronized (HeroSqliteManager.class) {                if (instance == null) {                    instance = new HeroSqliteManager();                }            }        }        return  instance;    }    private HeroSqliteManager() {        dbHelper = new HeroSqliteHelper(HeroApplication.getContext());        db = dbHelper.getWritableDatabase();    }    /**     * 插入记录     * @param hero     */    public void insertData(Hero hero) {        ContentValues cv = new ContentValues();        cv.put(NAME_FIELD, hero.name);        cv.put(ICOID_FIELD, hero.icoId);        cv.put(ATTACK_FIELD, hero.attack);        cv.put(DEFENSE_FIELD, hero.defense);        db.insert(TABLE_NAME, null, cv);    }    /**     * 删除记录     * @param     */    public void deleteData(int id) {        String whereClasuse = "_id = ?";        String[] whereArgs = new String[]{String.valueOf(id)};        db.delete(TABLE_NAME, whereClasuse, whereArgs);    }    /**     * 修改记录     * @param hero     */    public void updateData(Hero hero) {        ContentValues cv = new ContentValues();        cv.put(NAME_FIELD, hero.name);        cv.put(ICOID_FIELD, hero.icoId);        cv.put(ATTACK_FIELD, hero.attack);        cv.put(DEFENSE_FIELD, hero.defense);        String whereClasuse = "_id = ?";        String[] whereArgs = new String[]{String.valueOf(hero.id)};        db.update(TABLE_NAME, cv, whereClasuse, whereArgs);    }    /**     * 查询所有的英雄     * @return     */    public List<Hero> selectData() {        List<Hero> heroList = new ArrayList<>();        Cursor c = db.rawQuery("select * from " + TABLE_NAME, null);        while (c.moveToNext()) {            Hero hero = new Hero();            hero.id = c.getInt(c.getColumnIndex("_id"));            hero.name = c.getString(c.getColumnIndex(NAME_FIELD));            hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));            hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));            hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));            heroList.add(hero);        }        c.close();        return heroList;    }    /**     * 按name查询     * @param name     * @return     */    public Hero selectForName(String name) {        Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where name = ?", new String[]{name});        Hero hero = null;        if (c.moveToNext()) {            hero = new Hero();            hero.id = c.getInt(c.getColumnIndex("_id"));            hero.name = c.getString(c.getColumnIndex(NAME_FIELD));            hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));            hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));            hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));        }        c.close();        return hero;    }    public void destroy() {//        if (db != null) {//            db.close();//        }//        db = null;    }}

有兴趣的可以下载看下
SQLiteDemo

更多相关文章

  1. Netty实战(三)Unity程序采用netty和其他netty程序通信
  2. Android(安卓)HttpClient网络编程
  3. 2011.09.15 ——— android 桌面添加快捷方式之判断是否存在无效
  4. Android性能优化
  5. Android关机方法
  6. android之相机开发
  7. Android之Handler用法总结
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. 【Android(安卓)消息处理】Handler、Loop
  2. Android原生分享图片和视频
  3. android ultredit smali语法加亮
  4. Android线程优先级规定及其设置的具体方
  5. Windows及Android倍速播放视频软件下载
  6. Android中pendingIntent的深入理解
  7. Android(安卓)NDK开发之旅38--FFmpeg视频
  8. Android(安卓)ContentProvider基础
  9. Android(安卓)利用 Webservice 获取手机
  10. Android(安卓)性能优化:多线程