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
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, null, null, 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, null, null, 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, null, null);
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, null, null);
}
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, null, null, null, null);
cursor.moveToFirst();
Log.i("TAG",cursor.getString(1));
cursor.close();
}