开篇语:写代码是一个动手实践的过程,就算理解了每句代码,不动手写,就什么也得不到。
我是正在实习的新手,有很多小的地方很困扰我,粗浅地谈谈我的理解吧,简单地聊聊,邀喷,嘿嘿。这周team leader布置的任务是学习Android中与数据库相关的知识,总结梳理一下这周学的知识。分如下几部分来总结吧
- SQLite
- Ormlite
- Content Provider
1. SQLite基本介绍
为什么要使用数据库?
大多数程序都会涉及到有关数据的操作及管理、例如增删查改,这个时候SQLite是个不可多得的好帮手。数据库的操作有哪些?
对于数据来说,增删查改为最基本的操作。
2.SQLite在安卓中的使用
- SQLiteDatabase
SQLiteDatabase类代表一个数据库,获取了了SQLiteDatabase类后,就可以对数据库进行管理,操作数据了。个人理解应该算是android中对数据库操作的基础了。
创建/打开数据库的方式有两个,
1.openSQLiteDatabase(…….)
2.openOrCreateDatabase(…….)
看名字就懂。
数据的添加
使用insert方法
ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据cv.put("username","Jack Johnson");//添加用户名
cv.put("password","iLovePopMusic"); //添加密码
db.insert("user",null,cv);//执行插入操作
使用execSQL
String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句
db.execSQL(sql);//执行SQL语句据的删除2种方式可以实现
String whereClause = "username=?";//删除的条件
String[] whereArgs = {"Jack Johnson"};//删除的条件参数
db.delete("user",whereClause,whereArgs);//执行删除
使用execSQL方式的实现
String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句
db.execSQL(sql);//执行删除操作
数据修改
同上,仍是2种方式
ContentValues cv = new ContentValues();//实例化ContentValues
cv.put("password","iHatePopMusic");//添加要更改的字段及内容
String whereClause = "username=?";//修改条件
String[] whereArgs = {"Jack Johnson"};//修改条件的参数
db.update("user",cv,whereClause,whereArgs);//执行修改
使用execSQL方式的实现
String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL语句
db.execSQL(sql);//执行修改
数据查询
数据查询相对前面几种方法就复杂一些了,因为查询会带有很多条件
通过query实现查询的
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
各参数说明:
table | 表名称 |
---|---|
colums | 列名称数组 |
selection | 条件子句,相当于where |
selectionArgs | 条件语句的参数数组 |
groupBy | 分组 |
having | 分组条件 |
orderBy | 排序类 |
limit | 分页查询的限制 |
Cursor | 返回值,相当于结果集ResultSet |
2.SQLiteOpenHelper
实际开发中很少有直接使用SQLiteDatabase的方法来打开数据库,通常都会继承SQLiteOpenHelper中的getReadableDatabase()、getWritable()方法得到一个SQLiteDatabase.
SQLiteOpenHelper从名字上来看是android为开发者提供的一个帮助管理数据库的类,调用其构造器时,会要求调用基类构造器,通过基类构造方法来创建一个数据库,比如我的final String name 就是我的数据库的名字。使用时让自己定义的类来继承它,需要复写两个函数
public class SQLHelper extends SQLiteOpenHelper{
private static final String name = "person.db"; //数据库名称。
private static final int VERSION = 1; //数据库版本
public SQLHelper(Context context)[
super(context,name,null,VERSION);
}
public SQLHelper(Context context,int version){
super(context,name,null,version);
}
public SQLHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 该方法于初次创建数据库的时候使用
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT ,age TEXT);");
}
/**
* 该方法在newVersion>oldVersion时调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e("version update",newVersion+"");
}
}
可以发现onUpgrade()是个回调函数,具体是什么时候调用呢?
我定义了两个构造器,一个带参数int version , 另一个不带,为了简单地测试一下,我在Activity中调用了无version信息构造器helper = new SQLHelper(this);(此时默认版本为1),之后修改为helper = new SQLHelper(this,2);再次启动程序,调出logcat可以看到如下:
可以看到,通过构造器传参数,当version>old version时候会调用函数onUpgrade();
既然version参数可以>old version,为什么不能 < version呢?
不用担心,当然也有onDowngrade()函数啦。
3. Cursor
什么是cursor?
我在这个问题上纠结了很久。通过db中的query,rawQuery语句都有返回cursor的重载方法,那么cursor究竟是什么?我个人理解是指向某个(一系列)符合条件的数据(集合)游标,你可以查询当前cursor指向的数据项中的一系列数据,比我的创建的person表中会有,name,age,那么你就可以通过cursor来查询这些信息。cursor中的常用方法
methon | 用途 |
---|---|
close() | 关闭游标,释放资源 |
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) | 在缓冲区中检索请求的列的文本,将将其存储 |
getColumnCount() | 返回所有列的总数 |
getColumnIndex(String columnName) | 返回指定列的名称,如果不存在返回-1 |
getColumnIndexOrThrow(String columnName) | 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。 |
getColumnName(int columnIndex) | 从给定的索引返回列名 |
getColumnNames() | 返回一个字符串数组的列名 |
getCount() | 返回Cursor 中的行数 |
moveToFirst() | 移动光标到第一行 |
moveToLast() | 移动光标到最后一行 |
moveToNext() | 移动光标到下一行 |
moveToPosition(int position) | 移动光标到一个绝对的位置 |
moveToPrevious() | 移动光标到上一行 |
举个例子,如果我想获得我当前游标所指数据项的age属性
//先获得person表中age的列数
int nameColumnIndex = cur.getColumnIndex(Person.AGE);
//通过列数获得当前列的数据
String name = cur.getString(nameColumnIndex);
4. SimpleCursorAdapter
这个类可以将查询的一些列结果配置到一个list中,具体的用法
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor,new String[]{"_id", "age"}, new int[]{R.id.item_name, R.id.item_age});
//ls = (ListView) findViewById(R.id.personlist);
ls.setAdapter(adapter);
我相信大部分接触过list的同学都知道SimpleAdapter,把Cursor看成Map < Key,Value>,那么SimpleCursorAdapter和SimpleAdapter就很像了。
SimpleCursorAdapter使用中值得一提的是,SimpleCursorAdapter封装cursor要求底层数据表的主键列的列名为”_id”,因为SimpleCursorAdapter只能识别名为”_id”的主键,否则就会出现java.lang.IllegalArgumentException:colun ‘_id’ does not exist的错误。
结束语:有关数据库基础要使用到的东西就暂时介绍到这吧。有什么问题欢迎各位支出!
附大牛的详细介绍数据库基础与android中数据库的使用文章链接:
数据库基础知识
Android中使用数据库详解