Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 四大組件之ContentProvider(三)-ContentProvider的數據存儲

四大組件之ContentProvider(三)-ContentProvider的數據存儲

編輯:關於Android編程

第4節 ContentProvider的數據存儲

ContentProvider的數據存儲經常使用SQL實現,當然也可以采用別的存儲機制。

假設這個ContentProvider需要這樣一個數據表:

id name price 0 book0 15 1 book1 13 2 book2 18

4.1 SQL實現數據存儲

4.1.1 創建數據庫

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和安豆網發布,其他網站出現本教程均屬侵權。
/*******************************************************************/


4.1.2 為ContentProvider添加SQL支持

修改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命令,方便開發者靈活的操作數據。

SQLiteOpenHelpergetReadableDatabase()獲取讀取數據庫的能力; SQLiteOpenHelpergetWritableDatabase()獲取寫入數據庫的能力。

4.2 其他方式的數據存儲

除了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;
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved