1. 程式人生 > >Android四種儲存方式

Android四種儲存方式

插入資料:通過insert(String table, StringnullColumnHack, ContentValues values)方法插入資料,其中引數含義分別為:

    table: 目標表名

    nullColumnHack: 指定表中的某列列名。因為在SQLite中,不允許不允許插入所有列均為null的記錄,因此初始值有值為空時,此列需顯式賦予null

    values:ContentValues物件,類似於java中的Map。以鍵值對的方式儲存資料。

修改資料: update(String table,ContentValues values, String whereClause, String[] whereArgs)方法用於修改資料,其四個引數的具體含義如下:

    table: 目標表名

    values: 要被修改成為的新值

    whereClause:where子句,除去where關鍵字剩下的部分,其中可帶?佔位符。如沒有子句,則為null。

    whereArgs: 用於替代whereClause引數中?佔位符的引數。如不需傳入引數,則為null。

查詢資料:query()方法用SELECT 語句段構建查詢。SELECT 語句內容作為 query() 方法的引數,比如:要查詢的表名,要獲取的欄位名,WHERE 條件,包含可選的位置引數,去替代 WHERE 條件中位置引數的值,GROUP BY 條件,HAVING 條件。

除了表名,其他引數可以是 null。所以,以前的程式碼段可以可寫成:

 String[] columns={"ID","inventory"};

 String[] parms={"snicklefritz"};

 Cursor result=db.query("widgets",columns, "name=?",parms, null, null, null);

使用遊標

不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQLite 資料庫遊標,使用遊標,你可以:

通過使用 getCount() 方法得到結果集中有多少記錄;

通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;

通過 getColumnNames() 得到欄位名;

通過 getColumnIndex() 轉換成欄位號;

通過 getString(),getInt() 等方法得到給定欄位當前記錄的值;

通過 requery() 方法重新執行查詢得到遊標;

通過 close() 方法釋放遊標資源;

刪除資料:刪除資料也是一件很簡單的事,只需要呼叫delete方法,傳入引數即可,delete(String table, String whereClause,String[] whereArgs)的引數三個引數具體含義如下:

    table: 目標表名

    whereClause:where子句,除去where關鍵字剩下的部分,其中可帶?佔位符。如沒有子句,則為null。

    whereArgs: 用於替代whereClause引數中?佔位符的引數。如不需傳入引數,則為null。

4、contentprovider

ContentProvider概念

1、  ContentProvider提供為儲存和獲取資料提供了統一的介面;

2、  使用ContentProvider可以在不同的應用程式之間共享資料

3、  Android為常見的一些資料提供了ContentPrivider(包括音訊,視訊,圖片和通訊錄等等)

ContentProvider使用表的形式來組織資料

Uri

1、  每一個ContentProvider都擁有一個公共的uri,這個uri用於表示這個ContentProvider所提供的資料

2、  Android所提供的ContentProvider都存放在android.provider包當中

Uri代表了要操作的資料,Uri主要包含了兩部分資訊:1.需要操作的ContentProvider ,對ContentProvider中的什麼資料進行操作,一個Uri由以下幾部分組成:

1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定為:content://。

2.主機名(或Authority):用於唯一標識這個ContentProvider,外部呼叫者可以根據這個標識來找到它。

3.路徑(path):可以用來表示我們要操作的資料,路徑的構建應根據業務而定,如下:

要操作contact表中id為10的記錄,可以構建這樣的路徑:/contact/10

要操作contact表中id為10的記錄的name欄位, contact/10/name

要操作contact表中的所有記錄,可以構建這樣的路徑:/contact

要操作的資料不一定來自資料庫,也可以是檔案等他儲存方式,如下:

要操作xml檔案中contact節點下的name節點,可以構建這樣的路徑:/contact/name

如果要把一個字串轉換成Uri,可以使用Uri類中的parse()方法,如下:

Uriuri =Uri.parse("content://com.changcheng.provider.contactprovider/contact")

ContentProvider所提供的函式:

1、  query():查詢

2、  insert():插入

3、  update():更新

4、  delete():刪除

5、  getType():得到資料型別

6、  onCreate():建立時的回撥函式

實現ContentProvider的過程

1、  定義一個CONTENT_URI常量

2、  定義一個類,繼承ContentProvider

3、  實現query,insert,update,delete,getType,onCreate方法

4、  在AndroidManifest.xml當中進行宣告

下面是實現程式碼:

首先建立繼承contentprovider的類UserContentProvider .java

複製程式碼 public class UserContentProvider extends ContentProvider {
   private DatabaseHelper helper;
   private SQLiteDatabase db;
   private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
   private static final int USERS = 1;
   private static final int USER = 2;
   static{
      matcher.addURI("cn.csdn.activity.providers.userprovider", "user", USERS);
      matcher.addURI("cn.csdn.activity.providers.userprovider", "user/#", USER);
   }
   public int delete(Uri uri, String selection, String[]selectionArgs) {
      db=helper.getWritableDatabase();
      int num=0;
      switch(matcher.match(uri)){
      case USERS:
         num=db.delete("user", selection, selectionArgs);
         break;
      case USER:
         long id=ContentUris.parseId(uri);
         String where="id="+id;
         if(selection!=null&&!"".equals(selection)){
            where=where+" and"+selection;
         }
         num=db.delete("user", where, selectionArgs);
         break;
      default:
         throw new IllegalArgumentException("Unknown Uri:"+ uri);
      }
      return num;
   }
 
   public String getType(Uri uri) {
      switch(matcher.match(uri)){
      case USERS:
         return "vnd.android.cursor.dir/person";
      case USER:
         return "vnd.android.cursor.item/person";
      default:
         throw new IllegalArgumentException("Unknown Uri:"+ uri);
      }
   }
 
   public Uri insert(Uri uri, ContentValues values) {
      db=helper.getWritableDatabase();
      long rowid;
      switch(matcher.match(uri)){
      case USERS: //向表中新增新紀錄並返回其行號         rowid=db.insert("user", "id", values);
         return ContentUris.withAppendedId(uri, rowid);
      default:
         throw new IllegalArgumentException("Unknow Uri:" + uri);
      }    
   }
 
   public boolean onCreate() {
      helper=new DatabaseHelper(this.getContext(),"users.db");
      return true;
   }
 
   public Cursor query(Uri uri, String[] projection, Stringselection,
         String[] selectionArgs, String sortOrder) {
      db = helper.getReadableDatabase();
      switch(matcher.match(uri)){
      case USERS:
         return db.query("user", projection, selection, selectionArgs, nullnull, sortOrder);
      case USER:
         long id=ContentUris.parseId(uri);
         String where="id="+id;
         if(selection!=null&&!"".equals(selection)){
            where=where+" and"+selection;
         }
         return db.query("user", projection, where, selectionArgs, nullnull, sortOrder);
      default:
         throw new IllegalArgumentException("Unknown Uri:"+ uri);
      }
   }
 
   public int update(Uri uri, ContentValues values, String selection,
         String[] selectionArgs) {
      db=helper.getWritableDatabase();
      int num;
      switch(matcher.match(uri)){
      case USERS:
         num=db.update("user", values, selection, selectionArgs);
         break;
      case USER:
         long id=ContentUris.parseId(uri);
         String where="id="+id;
         if(selection!=null&&!"".equals(selection)){
            where=where+" and"+selection;
         }
         num=db.update("user", values, selection, selectionArgs);
         break;
      default:
         throw new IllegalArgumentException("Unknow Uri"+uri);
      }
      return num;
   }
}
配置manifest.xml:
需要在<application></application>中為provider進行註冊!!!!
provider android:authorities="cn.csdn.activity.providers.userprovider"
            android:name="UserContentProvider"></provider>
最後寫測試類:
//contentprovider測試   public void testinsert(){//插入資料      ContentResolver resolver = this.getContext().getContentResolver();
      Uri inserturi=Uri.parse("content://cn.csdn.activity.providers.userprovider/user");
      ContentValuesvalues=new ContentValues();
      values.put("username", "renhiali");
      values.put("password", "123");
      Uri uri=resolver.insert(inserturi, values);
      Log.i("TAG", uri.toString());
   }
   public void testdelete(){//刪除資料      ContentResolver resolver = this.getContext().getContentResolver();
      Uri deleteuri=Uri.parse("content://cn.csdn.activity.providers.userprovider/user/7");
      int num=resolver.delete(deleteuri, nullnull);
      Log.i("TAG", num+"");
   }
   public void testupdate(){//更新資料      ContentResolver resolver = this.getContext().getContentResolver();
      Uri uri=Uri.parse("content://cn.csdn.activity.providers.userprovider/user/8");
      ContentValuesvalues=new ContentValues();
      values.put("username", "123");
      resolver.update(uri, values, nullnull);
   }
   public void testquery(){//查詢資料      ContentResolver resolver = this.getContext().getContentResolver();
      Uri uri=Uri.parse("content://cn.csdn.activity.providers.userprovider/user/4");
      Cursor cursor=resolver.query(uri, nullnullnullnull);
      cursor.moveToFirst();
      Log.i("TAG",cursor.getString(1));
      cursor.close();
   } 複製程式碼