참고 사이트 : http://android-runner.springnote.com/pages/3075250
- Shared Preferences : UI state, user preferences, application setting 값들을 저장할때 사용할 수 있는 lightweight mechanism 으로 key/value 형태로 primitive data 를 저장할 수 있음
- Files : Device 내/외부 미디어에 파일을 생성하고 읽기/쓰기 할수 있는 기능을 제공함
- SQLite Databases : managed, structured data 접근이 필요할 때 SQLite relational database library 를 제공함
- Content Providers : 데이터를 저장하는 어느 방법보다도 개인적인 데이타를 공유하고 사용하는데 있어 잘 정의된 인터페이스를 사용할 수 있는 방법을 제공함. 안드로이드 표준 보안체계(Shared Permission System)을 사용하면 접근제어를 할 수도 있다.
Introducing Content Providers
- Application 데이터를 다른 Application과 공유가 필요할 때 사용되는 일반적인 인터페이스 매커니즘
- URI를 이용하여 query, write 같은 데이터 작업을 지원함
- Contact Manager, Media Player, Picture 등 다양한 곳에서 사용
http://developer.android.com/guide/topics/providers/content-providers.html
Using Content Providers
Content Provider에서 제공하는 기능은 ContentResolver class를 통해 사용 가능함
Introducing Content Resolvers
각 Application Context는 하나의 ContentResolver를 가짐
- ContentResolver cr = getContentResolver();
Content Provider의 URI는 AndroidManifest.xml에서 authority로 정의됨 (대부분의 Provider는 CONTENT_URI를 사용함)
- <provider android:name="MyProvider" android:authorities="com.paad.provider.myapp"/>
ContentResolver class를 이용하여 query, insery, delete, update method를 이용할 때 URI를 사용함
content://com.<CompanyName>.provider.<ApplicationName>/<DataPath> : 어떤 type의 모든 결과 값을 나타냄
content://com.paad.provider.myapp/items/<rowID> : 어떤 type의 특정한 레코드
- content://com.paad.provider.myapp/items
- content://com.paad.provider.myapp/items/5
Querying for Content
Content Provider의 query는 데이터베이스의 query와 유사
데이터베이스를 사용한 것처럼 query에 대한 result set을 Cursor로 얻음
데이터베이스의 "Extracting Results from a Cursor"에서 설명한 방법을 이용하여 cursor로 부터 원하는 값을 추출하여 사용
ContentResolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
- uri : 필요한 Content Provider data의 URI(content:// scheme)
- projection : select절 (result set에 포함되기를 원하는 컬럼)
- selection : where절 (? 사용가능)
- selectionArgs : where절에서 ?를 대체할 수 있는 args
- sortOrder : order
- // Return all rows
Cursor allRows = getContentResolver().query(MyProvider.CONTENT_URI, null, null, null, null);
// Return all columns for rows where column 3 equals a set value
// and the rows are ordered by column 5.
String where = KEY_COL3 + “=” + requiredValue;
String order = KEY_COL5;
Cursor someRows = getContentResolver().query(MyProvider.CONTENT_URI, null, where, null, order);
_ID | _COUNT | NAME | NUMBER |
---|---|---|---|
44 | 3 | Alan Vain | 212 555 1234 |
13 | 3 | Bully Pulpit | 425 555 6677 |
53 | 3 | Rex Cars | 201 555 4433 |
Adding, Updating, and Deleting Content
Inserts
ContentResolver는 record를 추가하기 위한 두 가지 method를 제공
Uri android.content.ContentResolver.insert(Uri url, ContentValues values) : 한개의 record를 추가하는 method로서 추가된 record의 새로운 URI를 리턴함
int android.content.ContentResolver.bulkInsert(Uri url, ContentValues[] values) : 여러개의 record를 추가하는 method로서 추가된 record의 개수를 리턴함
- // Create a new row of values to insert.
ContentValues newValues = new ContentValues(); - // Assign values for each row.
newValues.put(COLUMN_NAME, newValue);
[ ... Repeat for each column ... ]
Uri myRowUri = getContentResolver().insert(MyProvider.CONTENT_URI, newValues);
// Create a new row of values to insert.
ContentValues[] valueArray = new ContentValues[5];
// TODO: Create an array of new rows
int count = getContentResolver().bulkInsert(MyProvider.CONTENT_URI, valueArray);
Deletes
int android.content.ContentResolver.delete(Uri url, String where, String[] selectionArgs)
-
// Remove a specific row.
getContentResolver().delete(myRowUri, null, null);
// Remove the first five rows.
String where = “_id < 5”;
getContentResolver().delete(MyProvider.CONTENT_URI, where, null);
Updates
- // Create a new row of values to insert.
ContentValues newValues = new ContentValues();
// Create a replacement map, specifying which columns you want to
// update, and what values to assign to each of them.
newValues.put(COLUMN_NAME, newValue);
// Apply to the first 5 rows.
String where = “_id < 5”;
getContentResolver().update(MyProvider.CONTENT_URI, newValues, where, null);
Accessing Files in Content Providers
OutputStream android.content.ContentResolver.openOutputStream(Uri uri)
- // Insert a new row into your provider, returning its unique URI.
Uri uri = getContentResolver().insert(MyProvider.CONTENT_URI,newValues);
try {
// Open an output stream using the new row’s URI.
OutputStream outStream = getContentResolver().openOutputStream(uri);
// Compress your bitmap and save it into your provider.
sourceBitmap.compress(Bitmap.CompressFormat.JPEG, 50, outStream);
}
catch (FileNotFoundException e) { }
Native Android Content Providers
android.provider 패키지에 유용한 provider가 제공됨
- Browser : bookmarks, browser history, web searches
- CallLog : incoming/outgoing/missed calls, call details(caller ID, call durations)
- Contacts : contacts’ details
- MediaStore : multimedia(audio, video, images)
- Settings : device’s preferences(Bluetooth settings, ring tones..)
Using the Media Store Provider
Media Store Provider를 이용하여 audio, video, image 파일을 Android 파일시스템 상에서 관리할 수 있음
MediaStore class는 Media Store에 파일을 추가하는 간단하고 편리한 method를 제공
- android.provider.MediaStore.Images.Media.insertImage(getContentResolver(),sourceBitmap,“my_cat_pic”,“Photo of my cat!”);
Using the Contacts Provider
Application이 Contacts Provider를 이용하기 위해서는 AndroidManifest.xml에서 권한이 추가되어야 함
- <uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
- // Get a cursor over every contact.
Cursor cursor = getContentResolver().query(People.CONTENT_URI,null, null, null, null);
// Let the activity manage the cursor lifecycle.
startManagingCursor(cursor);
// Use the convenience properties to get the index of the columns
int nameIdx = cursor.getColumnIndexOrThrow(People.NAME); - int phoneIdx = cursor. getColumnIndexOrThrow(People.NUMBER);
String[] result = new String[cursor.getCount()];
if (cursor.moveToFirst())
do {
// Extract the name.
String name = cursor.getString(nameIdx);
// Extract the phone number.
String phone = cursor.getString(phoneIdx);
result[cursor.getPosition()] = name + “ (“ + phone + “)”;
} while(cursor.moveToNext());
Creating a New Content Provider
1. ContentProvider class를 상속받아 새로운 Content Provider class 생성하기
- import android.content.*;
import android.database.Cursor;
import android.net.Uri;
import android.database.SQLException;
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
// TODO: Construct the underlying database.
return true;
}
}
2. URI 등록하기
- public class MyProvider extends ContentProvider {
private static final String myURI =“content://com.paad.provider.myapp/items”;
public static final Uri CONTENT_URI = Uri.parse(myURI);
- @Override
public boolean onCreate() {
// TODO: Construct the underlying database.
return true;
}
- // Create the constants used to differentiate between the different
// URI requests.
private static final int ALLROWS = 1;
private static final int SINGLE_ROW = 2;
private static final UriMatcher uriMatcher;
// Populate the UriMatcher object, where a URI ending in ‘items’ will
// correspond to a request for all items, and ‘items/[rowID]’
// represents a single row.
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(“com.paad.provider.myApp”, “items”, ALLROWS);
uriMatcher.addURI(“com.paad.provider.myApp”, “items/#”, SINGLE_ROW);
}
- }
3. ContentProvider의 query, insert, delete, update, getType method override
- @Override
public Cursor query(Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String sort) {
// If this is a row query, limit the result set to the passed in row.
switch (uriMatcher.match(uri)) {
case SINGLE_ROW :
// TODO: Modify selection based on row id, where:
// rowNumber = uri.getPathSegments().get(1));
}
return null;
} - @Override
public Uri insert(Uri _uri, ContentValues _initialValues) {
long rowID = 1;//[ ... Add a new item ... ]
// Return a URI to the newly added item.
if (rowID > 0) {
return ContentUris.withAppendedId(CONTENT_URI, rowID);
}
throw new SQLException("Failed to add new item into " + _uri);
} - @Override
public int delete(Uri uri, String where, String[] whereArgs) {
switch (uriMatcher.match(uri)) {
case ALLROWS:
case SINGLE_ROW:
default: throw new IllegalArgumentException("Unsupported URI:" + uri);
}
} - @Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
switch (uriMatcher.match(uri)) {
case ALLROWS:
case SINGLE_ROW:
default: throw new IllegalArgumentException("Unsupported URI:" + uri);
}
} - @Override
public String getType(Uri _uri) {
switch (uriMatcher.match(_uri)) {
case ALLROWS: return "vnd.paad.cursor.dir/myprovidercontent";
case SINGLE_ROW: return "vnd.paad.cursor.item/myprovidercontent";
default: throw new IllegalArgumentException("Unsupported URI: " + _uri);
}
}
4. Provder를 AndroidManifest.xml에 추가하기
- <provider android:name="MyProvider" android:authorities="com.paad.provider.myapp"/>
[출처] ContentResolver|작성자 MK
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - URI parser에서 분석되는 방법 (0) | 2014.01.05 |
---|---|
안드로이드 - SD카드 마운트-탈착에 관한 인텐트 (0) | 2014.01.05 |
안드로이드 - arraylist를 인텐트로 넘기는 방법! (0) | 2014.01.02 |
안드로이드 - 바탕화면 위젯의 버튼 리스너 등록방법! (0) | 2014.01.01 |
안드로이드 - App Widget 이야기 (0) | 2013.12.31 |
안드로이드 - Android AppWidget, RemoteViews and CheckBox (0) | 2013.12.31 |
안드로이드 - DataBase 변경 시에 ContentObserver 이용하여 check 하는 방법. (0) | 2013.12.31 |
안드로이드 - 앱위젯 appwidget 만들기 2탄 (0) | 2013.12.27 |