Android 데이터 영구 화 ContentProvider 메커니즘 상세 설명

이 사례 는 안 드 로 이 드 데이터 의 지속 적 인 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 조건 등 을 지정 해 야 합 니 다.
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,,,,,,,,그리고 을 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기