編輯:關於Android編程
ContentProvider
的數據存儲經常使用SQL實現,當然也可以采用別的存儲機制。
假設這個ContentProvider
需要這樣一個數據表:
Android SDK提供了SQLiteOpenHelper
來方便開發者使用SQL數據庫。
繼承SQLiteOpenHelper
,創建我們的幫助類,
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
在構造函數中,創建數據庫,指定數據庫的名字和版本號,
private final static String DB_NAME = "my.db";
private final static int DB_VERSION = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
在onCreate()
函數中,根據前面的表格設計,創建SQL數據表,
public final static String TABLE_NAME = "books_table";
@Override
public void onCreate(SQLiteDatabase db) {
String BOOK_TABLE_CMD = "CREATE TABLE " +TABLE_NAME
+ "("
+ "id" + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "name" +" VARCHAR(50),"
+ "price" + " VARCHAR(50)"
+ ");" ;
db.execSQL(BOOK_TABLE_CMD);
}
當數據表的結構發生變化時,需要進行應對原來數據表的升級。這裡只是簡單的刪除以前存在的表格,再重新創建一個表格。在實際的商用軟件中,要考慮到數據庫表格的變化,把以前老數據表中的數據,逐一轉存到新的數據表當中,
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME);
onCreate(db);
}
/*******************************************************************/
* 版權聲明
* 本教程只在CSDN和安豆網發布,其他網站出現本教程均屬侵權。
/*******************************************************************/
修改MyContentProvider
的增刪改查函數,使用數據庫實現對數據的操作。
onCreate()
,創建SQL幫助類,
private DBHelper mDBHelper;
@Override
public boolean onCreate() {
Log.d(TAG, " onCreate");
mDBHelper = new DBHelper(getContext());
return true;
}
insert()
,插入數據,
@Override
public Uri insert(Uri uri, ContentValues values) {
Uri result = null;?
switch (sUriMatcher.match(uri)) {
case BOOKS: {
SQLiteDatabase db = mDBHelper.getWritableDatabase();
long id = db.insert(DBHelper.TABLE_NAME, null, values);
if(id > 0) {
result = ContentUris.withAppendedId(CONTENT_BOOKS_URI, id);
}
}
break;
......
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
delete()
,刪除數據,
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int result = 0;
switch (sUriMatcher.match(uri)) {
case BOOKS: {
SQLiteDatabase db = mDBHelper.getWritableDatabase();
int count = db.delete(DBHelper.TABLE_NAME, selection, selectionArgs);
result = count;
}
break;
......
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
update()
,更新數據,
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int result = 0;
switch (sUriMatcher.match(uri)) {
case BOOKS: {
SQLiteDatabase db = mDBHelper.getWritableDatabase();
int count = db.update(DBHelper.TABLE_NAME, values, selection, selectionArgs);
result = count;
}
break;
......
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
query()
,查詢數據,
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor result = null;
switch (sUriMatcher.match(uri)) {
case BOOKS: {
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
result = cursor;
}
break;
......
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
SQLiteOpenHelper
可以直接使用ContentProvider
傳入的SQL命令,方便開發者靈活的操作數據。
SQLiteOpenHelper
的getReadableDatabase()
獲取讀取數據庫的能力; SQLiteOpenHelper
的getWritableDatabase()
獲取寫入數據庫的能力。
除了SQL,還可以使用別的方式存儲數據,例如文本文件,甚至鏈表。
對於不使用SQL的實現方式,query()
函數要返回Cursor
對象,那麼可以使用MatrixCursor
,例如,
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor result = null;
switch (sUriMatcher.match(uri)) {
case BOOKS: {
String[] tableCursor = new String[] { "id", "name", "price" };
MatrixCursor cursor = new MatrixCursor(tableCursor);
cursor.addRow(new Object[] { "8", "book8", "23" });
result = cursor;
}
break;
......
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
這次我們以circular-progress-button開源項目為案例進行分析,這個開源項目裡涉及到Drawable的使用,所以是一個不錯分析案例。一、項目概述這個項目
實現效果圖:下面是具體代碼,可直接復制:package com.lcw.rabbit.widget;import android.animation.ObjectAnim
1.首先集成的項目目錄我使用的是直接按照react-native init Project 的格式來導入的,也就是說,我的Android項目
QQ空間打賞紅包是手機QQ最近新推出的一個功能,這個打賞紅包功能可以讓你給QQ空間中發表優質內容的人打賞紅包,如果你看到好友發了一條說說可以試試這個QQ空間