Android 데이터 영구 화 ContentProvider 메커니즘 상세 설명
9535 단어 Android데이터 영구 화ContentProvider
일반적으로 안 드 로 이 드 운영 체제 의 응용 프로그램 이 구축 한 데 이 터 는 자신 만 사용 할 수 있 고 응용 프로그램 은 서로 공용 메모리 로 데 이 터 를 공유 할 수 없습니다.안 드 로 이 드 시스템 은 콘 텐 츠 제공 기(ContentProvider)를 제공 하여 자신의 개인 데 이 터 를 데이터 내 용기 에 공개 합 니 다.이 기 제 를 통 해다른 프로그램 에서 자신의 내부 데 이 터 를 읽 을 수 있 고 다른 프로그램의 데이터 에 도 접근 할 수 있 습 니 다.일반적으로 콘 텐 츠 제공 기 뒤에 SQLite 데이터 베 이 스 를 지원 하여 콘 텐 츠 를 저장 하여 내부 데 이 터 를 제공 합 니 다.
ContentProvider 와 SQLite 의 차 이 를 실현 합 니 다.
응용 프로그램 이 SQLite 를 실현 할 때 응용 프로그램 이 데이터베이스 와 직접 연결 하기 때문에 응용 프로그램 에서 SQLite 의 인 터 페 이 스 를 실현 해 야 합 니 다.db.onCreate(),db.insert(),db.update(),db.delete(),db.query()와 db.close();
콘 텐 츠 제공 기 를 실현 할 때 응용 프로그램 과 데이터 베이스 사이 에 ContentProvider 프로그램 을 실현 해 야 합 니 다.이 ContentProvider 프로그램 은 데이터 베이스 와 직접 연결 합 니 다.이때 응용 프로그램 은 ContentProvider 프로그램 과 인 터 페 이 스 를 실현 하 는 방법 이 필요 합 니 다.
콘 텐 츠 제공 기 를 만 드 는 방법 에 대해 말씀 드 리 겠 습 니 다.
우선,콘 텐 츠 제공 기 인터페이스 구현:
이 인 터 페 이 스 를 실현 하 는 다섯 가지 중요 한 방법;
그 다음 에 데이터 Uri 를 정의 합 니 다.
공급 자 프로그램 은 다른 프로그램 이 이 콘 텐 츠 제공 자 에 접근 할 수 있 도록'기본'Uri 를 정의 해 야 합 니 다.이 Uri 는 유일한 것 이 어야 하 며'content:/'로 시작 해 야 합 니 다.content: 콘 텐 츠 제공 기 프로그램 이 제어 하 는 데이터 의 위 치 를 표시 합 니 다.AndroidManifest.xml 프로필 에 다음 코드 를 추가 하여 설명 합 니 다.
<!-- multiprocess ( )-->
<provider
android:name="ContentProviderClass"
android:multiprocess="true"
android:authorities="com.example.data_contentprovider.ContentProviderClass" >
</provider>
응용 프로그램 에 다음 코드 를 추가 합 니 다:
//acquire the Uri of ContentProvider
getIntent().setData(Uri.parse("content://com.example.data_contentprovider.ContentProviderClass"));
Uri uri = getIntent().getData();
Uri 가 있 는 위 치 를 정의 하고 콘 텐 츠 공급 자 프로그램의 인 터 페 이 스 를 찾 을 수 있 는 변 수 를 설정 합 니 다.다음은 완전한 코드 입 니 다.기능 은 콘 텐 츠 제공 기의 구축 과 이 콘 텐 츠 제공 기 프로그램 을 통 해 데 이 터 를 추가 하고 검색 하 는 것 입 니 다.
콘 텐 츠 제공 기 인터페이스 구현 코드:
package com.example.data_contentprovider;
import com.example.data_contentprovider.DB.DBHelper;
import android.net.Uri;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
public class ContentProviderClass extends ContentProvider {
DBHelper dataBaseHelper; // DataBaseHelper dataBaseHelper
// ContentProvider onCreate
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
dataBaseHelper = new DBHelper(getContext());
return true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db = dataBaseHelper.getWritableDatabase();
db.insert("test", null, values);
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
SQLiteDatabase db = dataBaseHelper.getReadableDatabase();
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables("test");
Cursor cursor = queryBuilder.query(db, projection, selection,
selectionArgs, null, null, null);
return cursor;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
Android Manifest.xml 파일 설정:
<!-- multiprocess ( )-->
<provider
android:name="ContentProviderClass"
android:multiprocess="true"
android:authorities="com.example.data_contentprovider.ContentProviderClass" >
</provider>
SQLite 데이터베이스 시스템 을 구축 하여 데 이 터 를 저장 하고 관리 하 는 동시에 SQLiteOpenHilper 류 를 이용 하여 데이터베이스 와 SQLiteDatabase 류 를 구축 하여 데이터 베 이 스 를 관리 합 니 다.
package com.example.data_contentprovider.DB;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
public class DBHelper extends SQLiteOpenHelper {
// test.db
public DBHelper(Context context) {
super(context, "test.db", null, 1);
}
// test
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table test (" + BaseColumns._ID
+ "integer primary key," + "name text," + "description text"
+ ");");
}
//
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS test");
onCreate(db);
}
}
다음은 provider 의 응용 프로그램 입 니 다.
package com.example.data_contentprovider;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class ContentProviderActivity extends Activity {
String [] from = {"column00","column01","column02"};
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//acquire the Uri of ContentProvider
getIntent().setData(Uri.parse("content://com.example.data_contentprovider.ContentProviderClass"));
Uri uri = getIntent().getData();
//create some data to test
ContentValues values = new ContentValues();
values.put("name", "marry");
values.put("description", "123456");
getContentResolver().insert(uri, values); // ContentResolver ( B , ContentResolver A ContentProvider 。)
values.put("name", "hello");
values.put("description", "654321");
getContentResolver().insert(uri, values);
//search db all colum,cursor point to first colum of result
Cursor cursor = managedQuery(uri, null, null, null, null);
cursor.moveToFirst();
//set ArrayList,view more field table
ArrayList<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
Map<String, Object> item;
//from db read data and save to ArrayList data container
for (int i = 0; i < cursor.getCount(); i++) {
item = new HashMap<String, Object>();
item.put("column00", cursor.getString(0));
item.put("column01", cursor.getString(1));
item.put("column02", cursor.getString(2));
data.add(item);
cursor.moveToNext();
}
cursor.close();
//ArrayList container data save to listView
ListView listView = new ListView(this);
SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.activity_content_provider, from, new int[]{R.id.text1,R.id.text2,R.id.text3});
listView.setAdapter(adapter);
setContentView(listView);
}
}
provider 응용 프로그램 은 이 콘 텐 츠 제공 기 를 통 해 데이터 베 이 스 를 검색 하고 데 이 터 를 추가 할 수 있 습 니 다.ContentProvider 에서 중요 한 몇 가지 종류:
UriMatcher:
UriMatcher 를 이해 하려 면 먼저 안 드 로 이 드 의 Uri 표시 방법 을 알 아야 합 니 다.알다 시 피 Uri 는 유 니 버 설 자원 식별 자 입 니 다.이 는 조작 할 데 이 터 를 대표 합 니 다.안 드 로 이 드 의 모든 자원(예 를 들 어 텍스트,이미지,동 영상 등)은 Uri 로 표시 할 수 있 습 니 다.Android 의 Uri 는 다음 세 부분 으로 구성 되 어 있 습 니 다.'content:/'(즉 authory),데이터 의 경로,자원 표지 ID(선택 가능),그 중에서 ID 가 존재 하면 특정한 자원 을 나타 내 고 ID 가 존재 하지 않 으 면 경로 아래 의 전 체 를 나타 냅 니 다.따라서 addUri()함수 의 3 개 매개 변수 도 위의 3 개 에 대응 합 니 다.UriMatcher 의 일치 과정 은 3 단계 로 나 뉜 다.UriMatcher 초기 화;필요 한 우리 등록 하기;등 록 된 우리 와 일치 합 니 다.
ContentResolver :
ContentProvider 를 사용 하여 서로 다른 응용 프로그램 에서 데 이 터 를 공유 할 때 그 데이터 의 노출 방식 은 데이터베이스 에 표 시 된 것 과 유사 한 방법 을 취한 다.한편,ContentResolver 는 데이터 베 이 스 를 유사 한 방법 으로 ContentProvider 에서 데 이 터 를 액세스 하 는 것 입 니 다.이것 은 Uri 를 통 해 ContentProvider 에서 제공 하 는 데 이 터 를 조회 하고 조회 할 때 목적 데이터 뱅 크 의 이름,데이터 세그먼트 의 데이터 형식,또는 자원 의 ID 를 알 아야 합 니 다.
SQLiteQueryBuilder:
SQL 쿼 리 문 구 를 생산 하 는 보조 클래스 로 SQLiteDatabase 에 편리 하 게 접근 할 수 있 습 니 다.SQL 쿼 리 문 구 를 구성 할 때 도 표 이름,열 이름,where 조건 등 을 지정 해 야 합 니 다.
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,,,,,,,,그리고 을 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.