Android使用SQLite数据库

一. 简介
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-value
    	ContentValues values,
    	//更新条件
    	String whereClause,
    	//更新条件数组
    	String[] whereArgs
    	);
    
    	private void updateToTable(SQLiteDatabase db){
    		//实例化ContentValues
    		ContentValues 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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页