Android中使用SQLite数据库需要借助SQLiteOpenHelper.通过继承SQLiteOpenHelper类来管理数据库。
一般定义自己的SQLiteOpenHelper时需要重写两个方法,onCreate()和onUpdate();以及构造函数。
public class MydatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME="starbuzz";//定义数据库名称 private static final int DB_VERTION=1;//数据库版本 public MydatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERTION);//建立数据库 } @Override public void onCreate(SQLiteDatabase db) { updateMyDatabase(db, 0, DB_VERTION);//建立数据库中的表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { updateMyDatabase(db,oldVersion,newVersion);//用于升级数据库 } private void updateMyDatabase(SQLiteDatabase db, int oldversion, int newversion) { if (oldversion < 1) { db.execSQL("CREATE TABLE DRINK (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "DESCRIPTION TEXT, " + "IMAGE_RESOURCE_ID INTEGER);"); insertDrink(db,"Han", "work very smart", R.drawable.first); insertDrink(db, "Lawson", "so cute", R.drawable.second); insertDrink(db, "Izumi Sakai", "so beatiful", R.drawable.third); } if (oldversion < 2) { db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC"); } }
//自定义插入DRINK表记录方法 private static void insertDrink(SQLiteDatabase db, String name, String description, int imageResourceId) { ContentValues contentValues = new ContentValues(); contentValues.put("NAME", name); contentValues.put("DESCRIPTION", description); contentValues.put("IMAGE_RESOURCE_ID", imageResourceId); db.insert("DRINK", null, contentValues); } }获取SQLiteOpenHelper实例,
MydatabaseHelper mydatabaseHelper = new MydatabaseHelper(this);//this为当前上下文参数
SQLiteDatabase sqLiteDatabase = mydatabaseHelper.getReadableDatabase();//通过调用getReadableDatabase()
//或者getWritableDatabase()可获取数据库。二者都可对数据库进行写入或读出,区别在于当数据库磁盘满时,前者//会采用只读的方式去打开数据库,而后者会抛出异常。
数据库包含增删改查四种操作,insert().delete().update().query().
public long insert(String table, String nullColumnHack, ContentValues values)
第一个参数为表名,第二个用于防止插入空行,一般值为Null.第三个为要插入的数据,如:
ContentValues contentValues = new ContentValues(); contentValues.put("NAME", name);其中NAME为表的属性值(不区分大小写),name为要插入的实际值.
public int delete(String table, String whereClause, String[] whereArgs)
第一个参数仍然为表名,二三两个用于筛选行。
如
sqlite.delete("Drink", "name=? and descriotion=?", String[]{"可乐","好评"})
问号处的值为后面的String[]值,代表删除表中名字为可乐,描述为好评的记录
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
第一个仍为表名,第二个为改变的新内容,三四用于定位行。
如:
contentValues.put("NAME", "橙汁");
sqlite.update("Drink",contentValues, "name=? and descriotion=?", String[]{"可乐","好评"})
表示将表中名字为可乐,描述为好评的记录(行),的名称(即可乐)改为橙汁
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
查询是四种方法中最复杂的,其返回一个Cursor对象,可以看作一个临时存储表,将数据库中表筛选后返回的结果表,第一个参数为表名,第二个参数为要查询的属性名称,如String[]{"Name","Description"},表示要查询名称和描述内容,第三,四个为筛选条件,与上述两个方法作用一样。后面三个一般为Null,用于Cursor中的分组,排序等。
Cursor中的内容获取通过cursor.moveto*和get*来获取。如:
if (cursor.moveToFirst()) { //获取这条记录的各个属性内容 String name = cursor.getString(0); String description = cursor.getString(1); int idText = cursor.getInt(2); boolean isFavorite = (cursor.getInt(3) == 1);
movetoFirst代表定位至第一行,getString(0)代表获取该行的第一个属性(其值为String类型,也有可能为其他类型)。还有moveToNext().moveToPrevious().moveToLast();分为代表是否存在下一行,上一行,和指向最后一行.
最后,很重要的一点,在连接数据库和操作数据库时,一般放在try catch中,因为连接外部时有可能出错,同理读写外部文件流时同理,用数据库和cursor后。要关闭数据库和cursor。采用close()方法。如cursor.close();