ContentProvder(內容提供者是安卓四大組件之一):爲存儲和獲取數據提供統一的接口。可以在不同的應用程序之間共享數據。Android已經爲常見的一些數據提供了默認的ContentProvider
1、ContentProvider使用表的形式來組織數據
無論數據的來源是什麼,ContentProvider都會認爲是一種表,然後把數據組織成表格
2、ContentProvider提供的方法
query:查詢
insert:插入
update:更新
delete:刪除
getType:得到數據類型
onCreate:創建數據時調用的回調函數
3、每個ContentProvider都有一個公共的URI,這個URI用於表示這個ContentProvider所提供的數據。Android所提供的ContentProvider都存放在android.provider包當中
下面說下我寫的
1.首先是ContentProvider(內容提供者)的主界面:
外面是用的LinearLayout佈局
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_main_id"
android:hint="ID:"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_main_name"
android:hint="Name:"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_main_age"
android:hint="age:"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
android:onClick="save"
/>
2.寫一個DbHelper(繼承SQLiteOpenHelper)連接數據庫並重新建一個表 重寫3個方法:
public DbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
Log.i("test","構造");
}
@Override
//創建數據時調用的回調函數
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//操作:創建表的操作
Log.i("test","創建表");
sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,name,age)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.i("test","數據庫版本,低--->高");
}
3.寫了一個類繼承ContentProvider
寫出ContentProvider提供的6個方法
因爲我只寫了一個查詢數據:
private static final int PERSONS=1;
private static final int PERSON=2;
@Override
public boolean onCreate() {
DbHelper dbHelper=new DbHelper(getContext(),"G150831.db",null,2);
sqLiteDatabase = dbHelper.getReadableDatabase();
//實例化URI匹配器
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//添加匹配規則
// content://com.zking.g150831_android16_sqlite.data/datas代表查詢所有
// content://com.zking.g150831_android16_sqlite.data/datas/1代表查詢單個
uriMatcher.addURI("com.zking.g150831_android16_sqlite.person","persons",MyProvider.PERSONS);
uriMatcher.addURI("com.zking.g150831_android16_sqlite.person","persons/#",MyProvider.PERSON);
Log.i("text","onCreate");
return false;
}
@Nullable
@Override
//查詢
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
//查詢所有的數據
Log.i("text","query");
int code=uriMatcher.match(uri);
switch (code) {
case MyProvider.PERSONS:
Log.i("text","query查詢所有");
return sqLiteDatabase.query(true,"person",strings,s,strings1,null,null,s1,null);
case MyProvider.PERSON:
Log.i("text","query查詢單個");
//獲取#好的值
long id= ContentUris.parseId(uri);
return sqLiteDatabase.rawQuery("select * from person where _id=?",new String[]{id+""});
}
return null;
那幾個方法我就不寫上去了
4.在androidMainfest.xml 清單文件中去配置這個MyProvider
<provider
android:authorities="com.zking.g150831_android16_sqlite.person"
android:name="com.zking.provider.MyProvider"
android:exported="true"
></provider>
5.在MainActivity這個類中寫了一個方法:
public void save(View view){
String name=et_main_name.getText().toString();
String age=et_main_age.getText().toString();
//存到數據庫
// ContentValues values=new ContentValues();//Map
// values.put("name",name);
// values.put("age",age);
// values.putNull("_id");
// database.insert("person","name",values);
//HQL QBC 純(原)
for (int i = 0; i <20 ; i++) {
//根據你寫入的數據循環20次
database.execSQL("insert into person values(null,?,?)",new String[]{name+i,age});
}
Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
}
ContentResolve(內容訪問者)
1.主界面:
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_main"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="獲取數據"
android:onClick="getdata"
/>
2.MainActivity寫了個判斷EditText有沒有數據在查詢:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取內容訪問者
cr = getContentResolver();
et_main = (EditText) findViewById(R.id.et_main);
}
public void getdata(View view){
if (TextUtils.isEmpty(et_main.getText())){
//如果查詢爲空就查所有
uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons");
}
else {
//否則查詢單個
String id=et_main.getText().toString();
uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons/"+id);
}
//
Cursor cursor= cr.query(uri,null,null,null,null);
//單個查詢
//01.條件查詢_id=3
//02.網頁查詢?id=4
//03.URI匹配器
//SimpleCursorAdaper
while (cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
Log.i("text","_"+id+"_"+name+"_"+age);
}
}