Android ContentProvider 기반 요약 정보
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에서
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());
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.