第一节 用SQLite存储你重要的数据
1、简介
SQL是轻量级的关系型数据库,它的运算速度非常快,占用资源很少。是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。
SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。
2、支持字段类型
VARCHAR(10),NVARCHAR(15),TEXT,INTEGER,FLOAT,BOOLEAN,CLOB,BLOB,TIMESTAMP,NUMERIC(10,5),VARYING CHARACTER (24),NATIONAL VARYING CHARACTER(16)。
3、创建数据库
//SQLiteOpenHelper可以帮助我们更方便地管理数据库,但其是抽象类,需继承重写。
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_USER_INFO = "create table UserInfo ("
+ "id integer primary key autoincrement, "
+ "user_name text, "
+ "user_password text, "
+ "logon boolean)";
public static final String CREATE_LOGIN_HISTORY = "create table LoginHistory ("
+ "id integer primary key autoincrement, "
+ "user_name text, "
+ "login_time text)";
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
//参数分别为Context、数据库名、允许返回自定义的Cursor,一般传入null、版本号(与onUpgrade方法有关)
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER_INFO);
db.execSQL(CREATE_LOGIN_HISTORY);
//示例中创建了两个表
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
4、添加数据
MyDatabaseHelper mDBHelper = new MyDatabaseHelper(this, "LoginInfo.db", null, 1);
SQLiteDatabase db = mDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("user_name", userName);
values.put("user_password", password);
values.put("logon", true);
db.insert("UserInfo", null, values);
//参数分别为:表名、未指定添加数据时给某些可为空的列自动赋值NULL、ContentValues对象
5、更新数据
MyDatabaseHelper mDBHelper = new MyDatabaseHelper(this, "LoginInfo.db", null, 1);
SQLiteDatabase db = mDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("logon", true);
db.update("UserInfo", values, "user_name = ?", new String[]{userName});
//参数为:表名;ContentValues对象;三、四参数用于约束更新某一行或多行的条件。
6、删除数据
db.delete("LoginHistory", "user_name = ?", new String[]{userName});
6、查询数据
SQLiteDatabase db = mDBHelper.getWritableDatabase();
Cursor cursor = db.query("LoginHistory", null, null, null, null, null, null);
if (cursor.moveToFirst()){
mHistoryDatas.clear();
UserLoginHistoryData historyData;
do {
String userName = cursor.getString(cursor.getColumnIndex("user_name"));
String loginDate = cursor.getString(cursor.getColumnIndex("login_time"));
historyData = new UserLoginHistoryData(userName, loginDate);
mHistoryDatas.add(historyData);
} while (cursor.moveToNext());
}
cursor.close();
db.query的参数:
table 指定查询的表名
columns 指定查询的列名
selection 指定where的约束条件
selectionArgs 为where中的占位符“?”提供具体的值
groupBy 指定需要group by的列
having 对group by后的结果进一步约束
orderBy 指定查询结果的排序方式
第二节 系统源码也经常用的ContentProvider
1、简介
ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
2、提供的方法
query:查询
insert:插入
update:更新
delete:删除
getType:得到数据类型
onCreate:创建数据时调用的回调函数
3、示例
public class MyContentProvider extends ContentProvider {
//访问表的所有列
public static final int INCOMING_USER_COLLECTION = 1;
//访问单独的列
public static final int INCOMING_USER_SINGLE = 2;
//操作URI的类
public static final UriMatcher uriMatcher;
//为UriMatcher添加自定义的URI
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user",INCOMING_USER_COLLECTION);
uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user/#",INCOMING_USER_SINGLE);
}
private DatabaseHelp dh;
//为数据库表字段起别名
public static HashMap userProjectionMap;
static
{
userProjectionMap = new HashMap();
userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
}
/**
* 删除表数据
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
System.out.println("delete");
//得到一个可写的数据库
SQLiteDatabase db = dh.getWritableDatabase();
//执行删除,得到删除的行数
int count = db.delete(UserTableMetaData.TABLE_NAME, selection, selectionArgs);
return count;
}
/**
* 数据库访问类型
*/
@Override
public String getType(Uri uri) {
System.out.println("getType");
//根据用户请求,得到数据类型
switch (uriMatcher.match(uri)) {
case INCOMING_USER_COLLECTION:
return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE;
case INCOMING_USER_SINGLE:
return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE_ITEM;
default:
throw new IllegalArgumentException("UnKnown URI"+uri);
}
}
/**
* 插入数据
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
//得到一个可写的数据库
SQLiteDatabase db = dh.getWritableDatabase();
//向指定的表插入数据,得到返回的Id
long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
if(rowId > 0){//判断插入是否执行成功
//如果添加成功,利用新添加的Id和
Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
//通知监听器,数据已经改变
getContext().getContentResolver().notifyChange(insertedUserUri, null);
return insertedUserUri;
}
return uri;
}
/**
* 创建ContentProvider时调用的回调函数
*/
@Override
public boolean onCreate() {
System.out.println("onCreate");
//得到数据库帮助类
dh = new DatabaseHelp(getContext(),MyContentProviderMetaData.DATABASE_NAME);
return false;
}
/**
* 查询数据库
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//创建一个执行查询的Sqlite
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
//判断用户请求,查询所有还是单个
switch(uriMatcher.match(uri)){
case INCOMING_USER_COLLECTION:
//设置要查询的表名
qb.setTables(UserTableMetaData.TABLE_NAME);
//设置表字段的别名
qb.setProjectionMap(userProjectionMap);
break;
case INCOMING_USER_SINGLE:
qb.setTables(UserTableMetaData.TABLE_NAME);
qb.setProjectionMap(userProjectionMap);
//追加条件,getPathSegments()得到用户请求的Uri地址截取的数组,get(1)得到去掉地址中/以后的第二个元素
qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));
break;
}
//设置排序
String orderBy;
if(TextUtils.isEmpty(sortOrder)){
orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
}
else{
orderBy = sortOrder;
}
//得到一个可读的数据库
SQLiteDatabase db = dh.getReadableDatabase();
//执行查询,把输入传入
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
//设置监听
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
/**
* 更新数据库
*/
@Override
public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
System.out.println("update");
//得到一个可写的数据库
SQLiteDatabase db = dh.getWritableDatabase();
//执行更新语句,得到更新的条数
int count = db.update(UserTableMetaData.TABLE_NAME, values, selection, selectionArgs);
return count;
}
}
本文详细介绍SQLite数据库的基础使用方法,包括创建数据库、添加、更新、删除和查询数据等基本操作,并通过示例代码进行说明。此外,还介绍了ContentProvider组件及其在Android系统中的应用。
732

被折叠的 条评论
为什么被折叠?



