注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红尘若梦

生活的色彩

 
 
 

日志

 
 

Android开发中SQLite应用初步补充  

2015-12-10 09:20:21|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
通过之前的示范,我们已经可以说初步掌握了相关SQLite操作的技巧,但是大家对相关的API还想要更深入的了解,那么今天接下来就讲讲有关这些API的方面:
1)直接执行SQL,不需要返回结果的,这个不用多说。

db.executeSQL(String sql);
db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集

2)增删改操作,会返回影响行数的。

db.insert(String table, String nullColumnHack, ContentValues values);
db.update(String table, Contentvalues values, String whereClause, String whereArgs);
db.delete(String table, String whereClause, String whereArgs);

以上三个方法的第一个参数都是要操作的表名;insert中的第二个参数表示如果插入的数据全为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也是一样,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE条件表达式,比如“hits > ? and hits < ?”等,最后的whereArgs参数是占位符的实际参数值String[]数组;delete方法的参数也可以参考以上。
3)最复杂的查询语句,需返回结果。

db.rawQuery(String sql, String[] selectionArgs);
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);

上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集;后面几种参数也都很类似,columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名,having指定分组条件,配合groupBy使用,orderBy指定排序的列名,limit指定分页参数,distinct可以指定“true”或“false”表示要不要过滤重复值。需要注意的是,selection、groupBy、having、orderBy、limit这几个参数中都不能包括“WHERE”、“GROUP BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL关键字。
以上方法都返回一个Cursor对象,代表数据集的游标,有点类似于JDBC中的ResultSet。而Cursor对象的常用方法也列在下面,跟ResultSet也十分类似:
move(int offset); //以当前位置为参考,移动到指定行

moveToFirst(); //移动到第一行
moveToLast(); //移动到最后一行
moveToPosition(int position); //移动到指定行
moveToPrevious(); //移动到前一行
moveToNext(); //移动到下一行
isFirst(); //是否指向第一条
isLast(); //是否指向最后一条
isBeforeFirst(); //是否指向第一条之前
isAfterLast(); //是否指向最后一条之后
isNull(int columnIndex); //指定列是否为空(列基数为0)
isClosed(); //游标是否已关闭
getCount(); //总数据项数
getPosition(); //返回当前游标所指向的行数
getColumnIndex(String columnName);//返回某列名对应的列索引值
getString(int columnIndex); //返回当前行指定列的String值

getInt(int columnIndex); //返回当前行指定列的Int值

getDouble(int columnIndex); //返回当前行指定列的Double值

getBlob(int columnIndex); //返回当前行指定列的Blob值

getLong(int columnIndex); //返回当前行指定列的Long值

getFloat(int columnIndex); //返回当前行指定列的Float值
getShort(int columnIndex); //返回当前行指定列的Short值

取到Cursor结果集还是有些地方需要注意:结果集中必须要包含一个“_id”的列,否则SimpleCursorAdapter就会取不到相应值,尤其是使用listview的时候,某些组件会直接去使用_id。解决办法有三种:
第一,建表时就_id为主键名;第二,查询时用别名来生成,例如:SELECT id AS _id FROM site;第三,在CursorWrapper里做映射:

CursorWrapper cursorWrapper = new CursorWrapper(c) {
@Override
public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {
if (columnName.equals("_id")) {
//请求_id时返回你指定的主键值

return super.getColumnIndex("id");
}
return super.getColumnIndexOrThrow(columnName);
}
};

除此之外,一般都会使用DBHelper继承了SQLiteOpenHelper,作为维护和管理数据库的基类,DBManager是建立在DBHelper之上,封装了常用的业务方法。下面是它们的例子:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "593668.db";
private static final int DATABASE_VERSION = 1;

public DBHelper(Context context) {
//CursorFactory设置为null,使用默认值
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

//类第一次被创建时onCreate会被调用
@Override
public void onCreate(SQLiteDatabase db) {
//建库,初始化数据操作
db.execSQL("CREATE TABLE IF NOT EXISTS person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, hits INTEGER)");
}

//如果DATABASE_VERSION值变动后,系统发现现有数据库版本不同,即会调用onUpgrade
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//执行一些升级库的相关SQL操作
}
}

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class DBManager {
private DBHelper helper;
private SQLiteDatabase db;

public DBManager(Context context) {
helper = new DBHelper(context);
//要确保context已初始化,是好把实例化DBManager的步骤放在Activity的onCreate里
db = helper.getWritableDatabase();
}

/**业务逻辑**/

public void closeDB() {
//关闭数据库
db.close();
}
}

组合以上就可以得心应手地操作SQLite,做APP也就是So Easy。

  评论这张
 
阅读(46)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017