标签:
一、SQLite数据库使用
public class MyHoardDatabase {
/**
* SQLiteOpenHelper是一个抽象类,它是用来创建、打开和升级数据库的最佳实践模式
*/
private static class HoardDBOpenHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "myDatabase.db";// 数据库名
private static final String DATABASE_TABLE = "GoldHoards"; // 数据库表名
private static final intDATABASE_VERSION = 1; // 数据库版本
// 创建数据库语句
private static final String DATABASE_CREATE = "create table "
+ DATABASE_TABLE + " (" + KEY_ID
+ " integer primary key autoincrement, "
+ KEY_GOLD_HOARD_NAME_COLUMN + " text not null, "
+ KEY_GOLD_HOARDED_COLUMN + " float, "
+ KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + " integer);";
/** 构造函数*/
public HoardDBOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
/** onCreate初始化函数,创建数据库*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
/** 数据库版本更新函数*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 这里采取的方法时delete原来的数据库,然后再重新创建数据库
db.execSQL("DROP TABLE IF IT EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
// 主键
public static final String KEY_ID = "_id";
// 表名
public static final String KEY_GOLD_HOARD_NAME_COLUMN = "GOLD_HOARD_NAME_COLUMN";
public static final String KEY_GOLD_HOARD_ACCESSIBLE_COLUMN = "OLD_HOARD_ACCESSIBLE_COLUMN";
public static final String KEY_GOLD_HOARDED_COLUMN = "GOLD_HOARDED_COLUMN";
// SQliteOpenHelper实例
private HoardDBOpenHelper hoardDBOpenHelper;
/** 构造函数*/
public MyHoardDatabase(Context context) {
// 创建SQLiteOpenHelper实例
hoardDBOpenHelper = new HoardDBOpenHelper(context,
HoardDBOpenHelper.DATABASE_NAME, null,
HoardDBOpenHelper.DATABASE_VERSION);
}
/**
* 关闭数据库(这里仅需将SQLiteOpenHelper close掉即可)
* */
public void closeDatabase() {
hoardDBOpenHelper.close();
}
/**
* 查询数据库,返回查询结果Cursor
* */
private Cursor getAccessibleHoard() {
// 需要获取的字段名列表
String[] result_columns = new String[] {
KEY_ID,
KEY_GOLD_HOARD_ACCESSIBLE_COLUMN,
KEY_GOLD_HOARDED_COLUMN };
// Where条件语句
String where = KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + "=" + 1;
// 其他一些限制参数
String whereArgs[] = null;
String groupBy = null;
String having = null;
String order = null;
// 根据SQLiteOpenHelper获取DataBase实例
SQLiteDatabase db = hoardDBOpenHelper.getWritableDatabase();
/** 根据语句查询数据库*/
Cursor cursor = db.query(HoardDBOpenHelper.DATABASE_TABLE,
result_columns, where, whereArgs, groupBy, having, order);
// 返回结果Cursor
return cursor;
}
/**
* 解析查询获取到的结果Cursor
* */
public float getAverageAccessibleHoardValue() {
// 掉用查询函数
Cursor cursor = getAccessibleHoard();
/** 这里是以获取到所有对应GOLD_HOARDED_COLUMN的字段值,并计算平均数*/
float totalHoard = 0f;
float averageHoard = 0f;
// 找出使用获取的数据列GOLD_HOARDED_COLUMN对应的索引
int GOLD_HOARDED_COLUMN_INDEX = cursor.getColumnIndexOrThrow(KEY_GOLD_HOARDED_COLUMN);
/** 对Cursor进行遍历*/
while (cursor.moveToNext()) {
// 获取每一行对应的值
float hoard = cursor.getFloat(GOLD_HOARDED_COLUMN_INDEX);
totalHoard += hoard;
}
// 计算平均数
float cursorCount = cursor.getCount();
// 这里是考虑除数为0的特殊情况
averageHoard = cursorCount > 0 ? (totalHoard / cursorCount) : Float.NaN;
// 使用完结果Cursor注意close
cursor.close();
return averageHoard;
}
/**
* 向数据库中插入添加数据操作
* */
public void addNewHoard(String hoardName, float hoardValue, boolean hoardAccessible) {
// 每插入一个新行,需要构造一个ContentValues对象,并使用put方法来填充每个键值对
ContentValues newValues = new ContentValues();
// ContentValues填充键值对
newValues.put(KEY_GOLD_HOARD_NAME_COLUMN, hoardName);
newValues.put(KEY_GOLD_HOARDED_COLUMN, hoardValue);
newValues.put(KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible);
// 插入记录的用法
SQLiteDatabase db = hoardDBOpenHelper.getWritableDatabase();
db.insert(HoardDBOpenHelper.DATABASE_TABLE, null, newValues);
}
/**
* 更新数据库操作
* */
public void updateHoardValue(int hoardId, float newHoardValue) {
// 同理创建ContentValues对象
ContentValues updatedValues = new ContentValues();
// 对应需要更新的键值对进行赋值
updatedValues.put(KEY_GOLD_HOARDED_COLUMN, newHoardValue);
// 填写Where条件语句
String where = KEY_ID + "=" + hoardId;
String whereArgs[] = null;
// 实现更新数据库的操作
SQLiteDatabase db = hoardDBOpenHelper.getWritableDatabase();
db.update(HoardDBOpenHelper.DATABASE_TABLE, updatedValues, where, whereArgs);
}
/**
* 删除数据库中的行的操作
* */
public void deleteEmptyHoards() {
// 条件语句
String where = KEY_GOLD_HOARDED_COLUMN + "=" + 0;
String whereArgs[] = null;
// 删除数据库对应操作
SQLiteDatabase db = hoardDBOpenHelper.getWritableDatabase();
db.delete(HoardDBOpenHelper.DATABASE_TABLE, where, whereArgs);
}
}二、Content Provider
<!-- 注册ContentProvider -->
<!-- 使用authorities标记来设定Content Provider的基本URI,Content Provider的授权如同一个地址,
Content Resolver使用它找到想要交互的数据库 -->
<!-- 一般URI的常用格式为com.<CompanyNanme>.provider.<ApplicationName> -->
<provider
android:name=".MyContentProvider"
android:authorities="com.paad.skeletondatabaseprovider"/>3)实现ContentProvider,为外界提供一些列接口
/**
* 实现Content Provider,提供query,insert,update等一系列数据库操作供
* Content Resolver来使用
*
* 其实实现上有前面使用SQLite数据库模式相仿,这里是为外界提供一系列操作数据库的接口
* */
public class MyContentProvider extends ContentProvider {
/** 每个Content Provider都应该使用一个公有的静态CONTENT_URI属性来公开它的授权,使其容易被找到
* 而这个Content Provider应该包含一个主要内容的数据路径*/
public static final Uri CONTENT_URI =
Uri.parse("content://com.paad.skeletondatabaseprovider/elements");
// 不同查询方式的标志
private static final intALLROWS = 1;
private static final intSINGLE_ROW = 2;
// 使用URriMatcher来区分不同的URI请求:是针对所有数据进行请求,还是仅请求单行数据
private static final UriMatcher uriMatcher;
// 添加匹配规则
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.paad.skeletondatabaseprovider", "elements", ALLROWS);
uriMatcher.addURI("com.paad.skeletondatabaseprovider", "elements/#", SINGLE_ROW);
}
public static final String KEY_ID = "_id";
public static final String KEY_COLUMN_1_NAME = "KEY_COLUMN_1_NAME";
private MySQLiteOpenHelper myOpenHelper;
@Override
public boolean onCreate() {
// 创建SQLiteOpenHelper实例
myOpenHelper = new MySQLiteOpenHelper(getContext(),
MySQLiteOpenHelper.DATABASE_NAME, null,
MySQLiteOpenHelper.DATABASE_VERSION);
return true;
}
/** 提供query操作
* 数据库查询操作
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 获得数据库实例
SQLiteDatabase db;
try {
db = myOpenHelper.getWritableDatabase();
} catch (SQLiteException ex) {
db = myOpenHelper.getReadableDatabase();
}
// WHERE条件语句
String groupBy = null;
String having = null;
/** 使用SQLiteQueryBuilder来简化构造数据查询的过程**/
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
// 通过URIMatcher来匹配URI,并对URI进行解析
// 如果是单行查询,则需要获得查询的是哪一行
switch (uriMatcher.match(uri)) {
case SINGLE_ROW:
String rowID = uri.getPathSegments().get(1);
queryBuilder.appendWhere(KEY_ID + "=" + rowID);
default:
break;
}
// 设置需要查询的table的名称
queryBuilder.setTables(MySQLiteOpenHelper.DATABASE_TABLE);
/** 执行查询操作语句*/
Cursor cursor = queryBuilder.query(db, projection, selection,
selectionArgs, groupBy, having, sortOrder);
return cursor;
}
/** 提供getType操作
* 根据URI类型返回一个正确的Content Provider MIME类型数据
*/
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case ALLROWS:
return "vnd.android.cursor.dir/vnd.paad.elemental";
case SINGLE_ROW:
return "vnd.android.cursor.item/vnd.paad.elemental";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
/** 提供delete操作
* 执行删除操作
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// 打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
// 匹配URI
switch (uriMatcher.match(uri)) {
case SINGLE_ROW:
String rowID = uri.getPathSegments().get(1);
selection = KEY_ID
+ "="
+ rowID
+ (!TextUtils.isEmpty(selection) ? " AND (" + selection
+ ')' : "");
default:
break;
}
if (selection == null)
selection = "1";
// 执行删除操作
int deleteCount = db.delete(MySQLiteOpenHelper.DATABASE_TABLE,
selection, selectionArgs);
// 通知有数据
getContext().getContentResolver().notifyChange(uri, null);
return deleteCount;
}
/**
* 提供insert操作
* */
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
String nullColumnHack = null;
// 执行insert操作
long id = db.insert(MySQLiteOpenHelper.DATABASE_TABLE, nullColumnHack, values);
// 若擦如操作成功
if (id > -1) {
// 返回CONTENT_URI+最新插入的行ID
Uri insertedId = ContentUris.withAppendedId(CONTENT_URI, id);
// 通知数据变更
getContext().getContentResolver().notifyChange(insertedId, null);
return insertedId;
} else
return null;
}
/** 提供insert操作*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
// 判断URI是否匹配
switch (uriMatcher.match(uri)) {
case SINGLE_ROW:
String rowID = uri.getPathSegments().get(1);
selection = KEY_ID
+ "="
+ rowID
+ (!TextUtils.isEmpty(selection) ? " AND (" + selection
+ ')' : "");
default:
break;
}
int updateCount = db.update(MySQLiteOpenHelper.DATABASE_TABLE, values,
selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return updateCount;
}
/**
* 同前面提到的使用SQLiteOpenHelper来操作数据库
**/
private static class MySQLiteOpenHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "myDatabase.db";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_TABLE = "mainTable";
private static final String DATABASE_CREATE = "create table "
+ DATABASE_TABLE + " (" + KEY_ID
+ " integer primary key autoincrement, " + KEY_COLUMN_1_NAME
+ " text not null);";
public MySQLiteOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase _db) {
_db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase _db, int _oldVersion,
int _newVersion) {
_db.execSQL("DROP TABLE IF IT EXISTS " + DATABASE_TABLE);
onCreate(_db);
}
}
}
ContentResolver contentResolver = this.getContentResolver();
public class DatabaseSkeletonActivity extends Activity {
static final String TAG = "DATABASESKELETONACTIVITY";
private SimpleCursorAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Use the Search Manager to find the SearchableInfo related
// to this Activity.
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchableInfo searchableInfo = searchManager
.getSearchableInfo(getComponentName());
// Bind the Activity's SearchableInfo to the Search View
SearchView searchView = (SearchView) findViewById(R.id.searchView);
searchView.setSearchableInfo(searchableInfo);
}
/**
* 查询数据库,查询所有行的情况
**/
private String getLargestHoardName() {
// 获得ContentResolver实例
ContentResolver cr = getContentResolver();
// 需要查询的字段名
String[] result_columns = new String[] { MyHoardContentProvider.KEY_ID,
MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN,
MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN };
// 查询限制语句
String where = MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN + "=" + 1;
String whereArgs[] = null;
String order = null;
/** 执行查询语句*/
Cursor resultCursor = cr.query(MyHoardContentProvider.CONTENT_URI,
result_columns, where, whereArgs, order);
/** 解析查询结果Cursor,类似于前面使用SQLite数据库查询的流程*/
float largestHoard = 0f;
String hoardName = "No Hoards";
int GOLD_HOARDED_COLUMN_INDEX = resultCursor
.getColumnIndexOrThrow(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN);
int HOARD_NAME_COLUMN_INDEX = resultCursor
.getColumnIndexOrThrow(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN);
while (resultCursor.moveToNext()) {
float hoard = resultCursor.getFloat(GOLD_HOARDED_COLUMN_INDEX);
if (hoard > largestHoard) {
largestHoard = hoard;
hoardName = resultCursor.getString(HOARD_NAME_COLUMN_INDEX);
}
}
// 使用完毕注意关闭Cursor
resultCursor.close();
return hoardName;
}
/**
* 查询单一某一行的情况
**/
private Cursor getRow(long rowId) {
ContentResolver cr = getContentResolver();
String[] result_columns = new String[] { MyHoardContentProvider.KEY_ID,
MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN,
MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN };
// 填充URI
Uri rowAddress = ContentUris.withAppendedId(
MyHoardContentProvider.CONTENT_URI, rowId);
String where = null;
String whereArgs[] = null;
String order = null;
/** 执行查询操作**/
Cursor resultCursor = cr.query(rowAddress, result_columns, where, whereArgs, order);
return resultCursor;
}
/** 数据库添加insert操作*/
private Uri addNewHoard(String hoardName, float hoardValue, boolean hoardAccessible) {
ContentValues newValues = new ContentValues();
// 填充键值对
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_NAME_COLUMN, hoardName);
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, hoardValue);
newValues.put(MyHoardContentProvider.KEY_GOLD_HOARD_ACCESSIBLE_COLUMN, hoardAccessible);
/** 通过ContentResolver来操作数据库*/
ContentResolver cr = getContentResolver();
Uri myRowUri = cr.insert(MyHoardContentProvider.CONTENT_URI, newValues);
return myRowUri;
}
/** 删除操作*/
private int deleteEmptyHoards() {
String where = MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN + "=" + 0;
String whereArgs[] = null;
ContentResolver cr = getContentResolver();
int deletedRowCount = cr.delete(MyHoardContentProvider.CONTENT_URI, where, whereArgs);
return deletedRowCount;
}
/** 更新操作*/
private int updateHoardValue(int hoardId, float newHoardValue) {
ContentValues updatedValues = new ContentValues();
updatedValues.put(MyHoardContentProvider.KEY_GOLD_HOARDED_COLUMN, newHoardValue);
Uri rowURI = ContentUris.withAppendedId(MyHoardContentProvider.CONTENT_URI, hoardId);
String where = null;
String whereArgs[] = null;
ContentResolver cr = getContentResolver();
int updatedRowCount = cr.update(rowURI, updatedValues, where, whereArgs);
return updatedRowCount;
}
/** 使用Cursor Loader异步查询内容
* 数据库操作可能是非常耗时的,所以对于任何数据库和ContentProvider查询而言,最好不要在应用程序的主线程中执行
* 较好的实现方式是使用Loader类,Loader被设计用来异步加载数据和监控底层数据源的变化
**/
LoaderManager.LoaderCallbacks<Cursor> loaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {
/** 当Loader初始化时会被调用,最终创建并返回一个新的CursorLoader对象*/
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = null;
String where = null;
String[] whereArgs = null;
String sortOrder = null;
Uri queryUri = MyContentProvider.CONTENT_URI;
return new CursorLoader(DatabaseSkeletonActivity.this, queryUri,
projection, where, whereArgs, sortOrder);
}
/** 当Loader Manager完成异步查询后,调用*/
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// @value SimpleCursorAdapter adapter
// 用一个新的结果集代替Cursor Adapter所显示的结果Cursor
adapter.swapCursor(cursor);
// 这个处事程序不会和UI线程同步,因此在修改任意UI元素之前需要同步它
}
/** 当Loader Manager重置Cursor Loader时候,调用*/
public void onLoaderReset(Loader<Cursor> loader) {
// 在List Adapter中将现有的结果Cursor移除
adapter.swapCursor(null);
// 这个处事程序也不会和UI线程同步,因此在修改任意UI元素之前需要同步它
}
};
}Activity: 活动,是最基本的android应用程序组件。一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。
Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。
Content Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
Service:服务,具有一段较长生命周期且没有用户界面的程序组件。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/woliuyunyicai/article/details/47341733