利用SQLiteOpenHelper来管理数据库的创建与更新
MyDBHelper dbhelper=new MyDBHelper(DemoActivity.this, "demo.dab3", 1) //创建并实例化SQLiteOpenHelper对象,数据库名为demo.db3,版本号为1;
public class MyDBHelper extends SQLiteOpenHelper { public MyDBHelper(Context context, String name, int version) { super(context, name, null, version); } @Override public void onCreate(SQLiteDatabase db) { //在数据库第一次生产的时候会调用这个方法,一般我们在这个方法里边生产数据库表;实际情况中,
//我们总是通过一个类继承SQLiteOpenHelper来使用SQLite数据库,那么什么时候会调用onCreate函
//数呢?当我们产生这个类的对象的时候是不会调用onCreate函数的,只有第一次通过这个对象调
//用getReadableDatabase或者getWritableDatabase函数时才会调用onCreate函数,而如果调用过一次
//这个对象的getReadableDatabase或者getWritableDatabase函数后系统将不会再调用onCreate函数。 System.out.println("x"); String CreateTableSql="create table Employee(" +"_id integer primary key autoincrement," +"no varchar," +"name varchar," +"sex varchar)"; db.execSQL(CreateTableSql); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { //当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删
//除数据库表,并建立新的数据库表,当然是否还需要做其他的操作,完全取决于应用程序的需求。 } }
使用SQLiteDatabase对象来操作SQLite数据库,这时候会执行MyDBhelper类中的onCreate()方法,实现表的创建
SQLiteDatabase db = dbhelper.getReadableDatabase(); //打开数据库demo.db3,返回数据库对象,赋值给db,利用db来操作数据库;getWritableDatabase()也是一样的,只是当磁盘出现内存不够时不一样,writable打开数据库会出错,而readable只会以只读方式打开
//SQLite对象不使用了,都要关闭,db.close(),可以在onDestroy()中实现。
当然了,对于熟悉SQL语法的程序员而言,直接使用db.execSQL()方法执行SQL语句就能完成数据的添加,删除,查询,更新等操作。对于不熟悉SQL语法的(比如我),SQLite专门提供了对应于添加,删除,查询,更新的操作方法,接下来一个一个的了解它们,
insert(String table, String nullColumnHack, ContentValues values): 用于添加数据,各个字段的数据使用ContentValues进行存放。 ContentValues类似于MAP,相对于MAP,它提供了存取数据对应的put(String key, Xxx value)和getAsXxx(String key)方法, key为字段名称,value为字段值,Xxx指的是各种常用的数据类型,如:String、Integer等。
ContentValues values = new ContentValues(); values.put("name", "工工"); values.put("age", 4); long rowid = db.insert(“Employee”, null, values);//返回新添记录的行号,与主键id无关.不管第三个参数是否包含数据,执行Insert()方法必然会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他字段值为Null的记录。
//如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
delete(String table, String whereClause, String[] whereArgs): whereClause是可选的where语句,whereArgs是whereClause语句中表达式的?占位参数列表。
db.delete("person", "personid<?", new String[]{"2"}); //从网上复制的例子,表不一样
或者
delete("user",
"username=?"
,args);
update(String table, ContentValues values, String whereClause, String[] whereArgs): 其实就是修改某一些数据。
ContentValues values = new ContentValues(); values.put(“name”, “工工”);//key为字段名,value为值 db.update("person", values, "personid=?", new String[]{"1"}); //把person表中personid=1的记录的name字段的值改为“工工“。
Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String grouBy, String having, String orderBy): columns表示想要显示的列,若为空则返回所有的列;selection是可选where语句,允许使用占位符?;selectionArgs是selection语句中表达式的?占位参数列表对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常;groupBy:相当于select语句group by关键字后面的部分;having:相当于select语句having关键字后面的部分;orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;
String[] args = {String.valueOf("a")}; query("user",new String[] { "username","password" },"username=?", args,null,null,null, null);
Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String grouBy, String having, String orderBy, String limit): limit参数用于控制查询数据的最多记录数。
query()查询得到的数据记录是封装在Cursor对象中的,Cursor对象类似于JDBC的ResultSet记录集,通过移动光标指向记录的方式来获取数据,移动光标的方法如下:
moveToFirst():移动到光标第一行
moveToLast():移动到光标最后一行
moveToNext():移动光标到下一行
moveToPosition(int position): 移动光标到一个绝对的位置
moveToPrevious():移动光标到上一行
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)
在缓冲区中检索请求的列的文本,将将其存储
getColumnCount()
返回所有列的总数
getColumnIndex(String columnName)
返回指定列的索引(不过网上都说是名称),如果不存在返回-1
getColumnIndexOrThrow(String columnName)
从零开始返回指定列的索引(网上都说是名称),如果不存在将抛出IllegalArgumentException 异常。
getColumnName(int columnIndex)
从给定的索引返回列名
getColumnNames()
返回一个字符串数组的列名
getCount()
返回Cursor 中的行数
for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()) //取出数据的一种方式;Cursor指向的是每一条数据 { int nameColumn = cur.getColumnIndex(People.NAME); int phoneColumn = cur.getColumnIndex(People.NUMBER); String name = cur.getString(nameColumn); String phoneNumber = cur.getString(phoneColumn); }
最后记得关闭数据库
dbhelper.close()