Android ContentProvider 기반 요약 정보

10961 단어 androidprovider
1. 적용 장면 1) ContentProvider는 데이터를 저장하고 읽기 위해 통일된 인터페이스를 제공한다 2) ContentProvider를 사용하면 응용 프로그램은 데이터 공유를 실현할 수 있다 3) android에 내장된 많은 데이터는 ContentProvider 형식으로 개발자가 호출할 수 있다(예를 들어 영상, 주파수, 이미지, 통신록 등) 2.관련 개념 소개 1) ContentProvider 소개는 응용 프로그램이 ContentProvider 클래스를 계승하고 이 클래스를 다시 작성하여 데이터를 제공하고 저장하는 방법을 사용하면 다른 응용 프로그램에 데이터를 공유할 수 있다.다른 방법을 사용해도 대외적으로 데이터를 공유할 수 있지만 데이터 접근 방식은 데이터 저장 방식에 따라 다르다. 예를 들어 파일 방식으로 대외적으로 데이터를 공유하려면 파일 조작 읽기와 쓰기를 해야 한다.sharedpreferences를 사용하여 데이터를 공유하려면sharedpreferences API로 데이터를 읽고 써야 합니다.ContentProvider를 사용하여 데이터를 공유하면 데이터 액세스 방식을 통일할 수 있습니다.2) Uri 클래스 소개 Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact") Content Provider에서 사용하는 쿼리 문자열은 표준 SQL 쿼리와 다릅니다. select,add,delete,modify 등 많은 작업을 특수한 URI로 진행합니다. 이 URI는 세 부분으로 구성되어 있습니다."content:/", 데이터를 나타내는 경로 및 데이터를 식별하는 ID(옵션)다음은 몇 가지 예제 URI입니다

content://media/internal/images  URI
content://contacts/people/  URI
content://contacts/people/45 URI ( ID 45 )
비록 이런 검색 문자열 형식은 매우 흔하지만, 보기에는 좀 매혹적이다.이를 위해 Android는 일련의 도움말 클래스(android.provider 패키지 아래)를 제공합니다. 그 안에는 클래스 변수 형식으로 제시된 검색 문자열이 많이 포함되어 있습니다. 이런 방식은 우리가 좀 더 이해하기 쉽기 때문에 위와 같습니다.content://contacts/people/45이 URI는 다음과 같이 쓸 수 있다. Uri person = ContentUris.withAppendedId(People.CONTENT_URI,  45);그리고 데이터 조회를 실행합니다:Cursorcur=managedQuery(person,null,null,null);이 검색은 모든 데이터 필드를 포함하는 커서를 되돌려줍니다. 이 커서를 교체해서 모든 데이터를 얻을 수 있습니다

package com.wissen.testApp;
public class ContentProviderDemo extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
displayRecords();
    }
    private void displayRecords() {
 //
     String columns[] = new String[] { People.NAME, People.NUMBER };
Uri mContacts = People.CONTENT_URI;
Cursor cur = managedQuery(
   mContacts,
   columns,  //
  null,   // WHERE
  null,  // WHERE
         null  // Order-by
     );
if (cur.moveToFirst()) {
    String name = null;
    String phoneNo = null;
    do {
//
     name = cur.getString(cur.getColumnIndex(People.NAME));
      phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER));
      Toast.makeText(this, name + ” ” + phoneNo, Toast.LENGTH_LONG).show();
   } while (cur.moveToNext());
}
    }
}
상례는 연락처 정보표의 지정한 데이터 열name과number를 순서대로 읽는 방법을 시범하였다.레코드 수정: ContentResolver를 사용할 수 있습니다.업데이트 () 방법으로 데이터를 수정합니다. 우리는 데이터를 수정하는 방법을 씁니다

private void updateRecord(int recNo, String name) {
    Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recNo);
    ContentValues values = new ContentValues();
    values.put(People.NAME, name);
    getContentResolver().update(uri, values, null, null);
}
이제 위와 같은 방법으로 지정한 기록을 업데이트할 수 있습니다: updateRecord(10,'XYZ').//제10조 기록의name 필드 값을 "XYZ"로 변경하여 기록을 추가합니다. 기록을 늘리려면 ContentResolver를 호출할 수 있습니다.insert () 방법, 이 방법은 추가할 기록의 목표 URI와 새로운 기록 값을 포함하는 맵 대상을 받아들입니다. 호출된 반환 값은 신기록의 URI이고 기록 번호를 포함합니다.위의 예에서 우리는 모두 연락처 정보부라는 표준을 바탕으로 하는 Content Provider입니다. 현재 우리는 연락처 정보부에 데이터를 추가하기 위해 insertRecord () 방법을 계속 만듭니다

private void insertRecords(String name, String phoneNo) {
    ContentValues values = new ContentValues();
    values.put(People.NAME, name);
    Uri uri = getContentResolver().insert(People.CONTENT_URI, values);
    Log.d(”ANDROID”, uri.toString());
    Uri numberUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);
    values.clear();
    values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE);
    values.put(People.NUMBER, phoneNo);
    getContentResolver().insert(numberUri, values);
}
이렇게 하면 우리는 insertRecords (name, phone No) 방식으로 연락처 정보부에 연락처 이름과 전화번호를 추가할 수 있다.레코드 삭제: Content Provider의 getContextResolver.delete () 메서드는 기록을 삭제하는 데 사용할 수 있으며, 다음 기록은 장치의 모든 연락처 정보를 삭제하는 데 사용됩니다

private void deleteRecords() {
    Uri uri = People.CONTENT_URI;
    getContentResolver().delete(uri, null, null);
}
특정한 기록을 삭제하기 위해 WHERE 조건 문장을 지정할 수도 있습니다: getContentResolver ().delete(uri, “NAME=” + “‘XYZ XYZ'”, null);이것은 이름이'XYZ XYZ'인 기록을 삭제합니다.3. ContentProvider를 만들려면 다음 단계를 따라야 합니다. a. ContentProvider의 상위 클래스를 계승한 클래스를 만듭니다. b. Content_라는 이름을 정의합니다.URI, 그리고public static final의 Uri 형식의 클래스 변수입니다. 유일한 문자열 값을 지정해야 합니다. 가장 좋은 방안은 클래스의 전체 이름입니다. 예를 들어public static final Uri CONTENT_URI = Uri.parse( “content://com.google.android.MyContentProvider”);c. 클라이언트에게 되돌려줄 데이터 열 이름을 정의합니다.만약 당신이 안드로이드 데이터베이스를 사용하고 있다면, 그 데이터베이스를 _라고 정의해야 합니다id의 열, 모든 기록의 유일성을 나타내는 데 사용됩니다.d. 데이터 저장 시스템을 만듭니다.대부분의 Content Provider는 Android 파일 시스템이나 SQLite 데이터베이스를 사용하여 데이터를 유지하지만, 원하는 방식으로 저장할 수도 있습니다.e. 바이트형 데이터, 예를 들어 비트맵 파일 등을 저장하려면 데이터 열은 실제 저장된 파일을 나타내는 URI 문자열로 대응하는 파일 데이터를 읽습니다.이러한 데이터 유형을 처리하는 Content Provider는 _데이터 필드,_데이터 필드에는 이 파일이 Android 파일 시스템의 정확한 경로를 보여 줍니다.이 필드는 클라이언트뿐만 아니라 ContentResolver에서도 사용할 수 있습니다.클라이언트는 ContentResolver를 호출할 수 있습니다.openOutputStream() 방법으로 이 URI가 가리키는 파일 자원을 처리합니다.ContentResolver 자체라면 클라이언트보다 권한이 높기 때문에 데이터 파일에 직접 접근할 수 있습니다.f. 커서에서 되돌아올 데이터 열을 지정하는 데 사용되는 public static String형 변수입니다.g. 질의는 Cursor 유형의 객체를 반환합니다.insert (), 업데이트 (), delete () 등 쓰기 작업을 수행하는 모든 방법이 감청됩니다.ContentResover()를 사용할 수 있습니다.notifyChange () 메서드는 데이터 업데이트에 대한 모니터 정보를 알려줍니다.h. Android Menifest에서.xml에서 탭을 사용하여 Content Provider를 설정합니다.i. 처리할 데이터 형식이 비교적 새로운 형식이라면 ContentProvider에 사용할 새로운 MIME 형식을 정의해야 합니다.geType(url)으로 돌아갑니다.MIME 유형은 두 가지 형식이 있습니다. 하나는 지정한 단일 기록을 위한 것이고, 다른 하나는 여러 개의 기록을 위한 것입니다.여기서 자주 사용하는 형식을 제시합니다

  vnd.android.cursor.item/vnd.yourcompanyname.contenttype ( MIME )
   , URI content://com.example.transportationprovider/trains/122 typevnd.android.cursor.item/vnd.example.rail MIME 。
  vnd.android.cursor.dir/vnd.yourcompanyname.contenttype ( MIME )
   , URI content://com.example.transportationprovider/trains vnd.android.cursor.dir/vnd.example.rail MIME 。
다음 코드는 사용자 이름만 저장하고 모든 사용자 이름을 표시하는 Content Provider를 만듭니다

public class MyUsers {
    public static final String AUTHORITY  = “com.wissen.MyContentProvider”;
    // BaseColumn _id
   public static final class User implements BaseColumns {
 public static final Uri CONTENT_URI  = Uri.parse(”content://com.wissen.MyContentProvider”);
 //
 public static final String  USER_NAME  = “USER_NAME”;
    }
}
위의 클래스에서 Content Provider를 정의한 CONTENT_URI 및 데이터 열다음은 위의 클래스를 바탕으로 실제 Content Provider 클래스를 정의합니다

public class MyContentProvider extends ContentProvider {
    private SQLiteDatabase     sqlDB;
    private DatabaseHelper    dbHelper;
    private static final String  DATABASE_NAME = “Users.db”;
    private static final int  DATABASE_VERSION= 1;
    private static final String TABLE_NAME= “User”;
    private static final String TAG = “MyContentProvider”;
    private static class DatabaseHelper extends SQLiteOpenHelper {
 DatabaseHelper(Context context) {
     super(context, DATABASE_NAME, null, DATABASE_VERSION);
 }
 @Override
 public void onCreate(SQLiteDatabase db) {
     //
 db.execSQL(”Create table ” + TABLE_NAME + “( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);”);
 }
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
     db.execSQL(”DROP TABLE IF EXISTS ” + TABLE_NAME);
     onCreate(db);
 }
    }
    @Override
    public int delete(Uri uri, String s, String[] as) {
 return 0;
    }
    @Override
    public String getType(Uri uri) {
 return null;
    }
    @Override
    public Uri insert(Uri uri, ContentValues contentvalues) {
 sqlDB = dbHelper.getWritableDatabase();
 long rowId = sqlDB.insert(TABLE_NAME, “”, contentvalues);
 if (rowId > 0) {
     Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();
     getContext().getContentResolver().notifyChange(rowUri, null);
     return rowUri;
 }
 throw new SQLException(”Failed to insert row into ” + uri);
    }
    @Override
    public boolean onCreate() {
 dbHelper = new DatabaseHelper(getContext());
 return (dbHelper == null) ? false : true;
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
 SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
 SQLiteDatabase db = dbHelper.getReadableDatabase();
 qb.setTables(TABLE_NAME);
 Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);
 c.setNotificationUri(getContext().getContentResolver(), uri);
 return c;
    }
    @Override
    public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
 return 0;
    }
}
My Content Provider라는 Content Provider가 생성되었습니다. 이것은 Sqlite 데이터베이스에서 기록을 추가하고 읽는 데 사용됩니다.Content Provider의 입구는 AndroidManifest에 있어야 합니다.xml에서 설정:

<provider android:name=”MyContentProvider” android:authorities=”com.wissen.MyContentProvider” />
다음에 이 정의된 Content Provider:1)를 사용하여 응용 프로그램에 Content Provider에 대한 접근 권한을 추가합니다.2) getContentResolver() 방법으로 ContentResolver 객체를 가져옵니다.3) ContentResolver 클래스의query() 메서드를 호출하여 데이터를 조회합니다. 이 메서드는 Cursor 객체를 반환합니다.4) 획득한 Cursor 객체를 분석하여 필요한 데이터를 얻습니다.5) Cursor 클래스의close() 메서드를 호출하여 Cursor 객체를 닫습니다..

public class MyContentDemo extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 insertRecord(”MyUser”);
 displayRecords();
    }

    private void insertRecord(String userName) {
 ContentValues values = new ContentValues();
 values.put(MyUsers.User.USER_NAME, userName);
 getContentResolver().insert(MyUsers.User.CONTENT_URI, values);
    }
    private void displayRecords() {
 String columns[] = new String[] { MyUsers.User._ID, MyUsers.User.USER_NAME };
 Uri myUri = MyUsers.User.CONTENT_URI;
 Cursor cur = managedQuery(myUri, columns,null, null, null );
 if (cur.moveToFirst()) {
     String id = null;
     String userName = null;
     do {
  id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));
  userName = cur.getString(cur.getColumnIndex(MyUsers.User.USER_NAME));
  Toast.makeText(this, id + ” ” + userName, Toast.LENGTH_LONG).show();
    } while (cur.moveToNext());
}
    }
}

좋은 웹페이지 즐겨찾기