时间:2021-07-14 07:58:24 | 栏目:Android代码 | 点击:次
一. 简介
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可以看到创建的数据库文件
2、创建数据库中的数据表
数据库创建完成后,要创建保存数据的表,表是存放在数据库中的。示例代码入下
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方式创建表。
3、对表进行操作(数据表的增删改查)
增:在表中增加数据,可以使用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(游标)对象 }
使用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; } }