콘텐트 프로바이더(ContentProvider) 학생DB 예제
안녕하세요 초이 입니다~ 저번 게시물인 콘텐츠 제공자의 개념에 콘텐츠 제공자의 사용예제를 살펴 볼까합니다. 혹시 저번 게시물이 필요하신 분은 아래 링크를 타고 이동하시면 됩니다~~
콘텐츠 프로바이더란? https://choidev-1.tistory.com/55
그럼 이제 부터 콘텐츠 프로바이더의 사용예제(학생DB)를 시작하겠습니다~
콘텐트 프로바이더 인터페이스
프로바이더는 외부에서 스토리지에 접근할 수 있는 약속된 인터페이스를 제공합니다. 가장 많이 사용되는 인터페이스는 아래 6가지 입니다.
[자주 사용하는 콘텐트 프로바이더 인터페이스]
- public Uri insert(Uri uri, ContentValues values)
- public int bulkInsert( Uri uri, ContentValues[] values)
- public Cursor query(Uri uri, ContentValues values, String selection, String[]selectionArgs)
- public update( Uri uri, ContentValues values, String selection, String[] selectionArgs)
- public int delete(Uri uri, String selection, String[] selectionArgs)
- public String getType( Uri uri)
insert, query update, delete는 데이터를 추가, 쿼리, 수정, 삭제하는 인터페이스이며 bulkInsert는 여러 개의 레코드 리스트를 한꺼번에 추가하는 인터페이스 입니다~
자 그럼~ 아래의 학생 DB를 생성하고 삭제하는 콘텐트 프로바이더(ContentProvider) 예제를 같이 보시죠
ContentProvider예제
목차
- [activity_main.xml] 작성 소스
- [AndroidManifest.xml] 작성 소스
- [MainActivity.java] 작성 소스
- [StudentDBManager.java] 작성 소스
- [StudentProvider.java] 작성 소스
- [activity_main.xml] 작성 소스
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/create"
android:text="생성"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick" />
<Button
android:id="@+id/insert"
android:text="추가"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick" />
<Button
android:id="@+id/update"
android:text="갱신"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick" />
<Button
android:id="@+id/delete"
android:text="삭제"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick" />
<Button
android:id="@+id/query"
android:text="쿼리"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick" />
</LinearLayout>
<EditText
android:id="@+id/edit_text"
android:gravity="top"
android:hint="this"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"/>
</LinearLayout>
- [AndroidManifest.xml] 작성 소스
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:authorities="com.example.junho.example.provider.StudentProvider"
android:name=".provider.StudentProvider"
android:exported="true"/>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
밑줄 친 부분이 작성하셔야 될 부분입니다.
- [MainActivity.java] 작성 소스
package com.example.junho.example;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
private static final String PROVIDER_URI = "content://com.example.junho.example.provider.StudentProvider";
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.edit_text);
}
public void onClick(View v){
switch (v.getId()){
case R.id.insert:
{
ContentValues addRowValue = new ContentValues();
addRowValue.put("number", "200106054");
addRowValue.put("name", "홍길동");
addRowValue.put("department", "컴퓨터");
addRowValue.put("age", "18");
addRowValue.put("grade", 3);
getContentResolver().insert(Uri.parse(PROVIDER_URI), addRowValue);
editText.setText("recode add");
break;
}
case R.id.query:
{
String[] columns = new String[]{"_id", "number", "name",
"department", "age", "grade"};
Cursor c = getContentResolver().query(
Uri.parse(PROVIDER_URI),
columns,
null, null, null, null);
if (c != null) {
editText.setText("");
while (c.moveToNext()) {
int id = c.getInt(0);
String number = c.getString(1);
String name = c.getString(2);
String department = c.getString(3);
String age = c.getString(4);
int grade = c.getInt(5);
editText.append(
"id : " + id + "\n" +
"number : " + number + "\n" +
"name : " + name + "\n" +
"department : " + department + "\n" +
"age : " + age + "\n" +
"grade : " + grade + "\n" +
"----------------------------");
}
editText.append("\n Total : " + c.getCount());
c.close();
}
break;
}
case R.id.update:
{
ContentValues updateRowValue = new ContentValues();
updateRowValue.put("name", "고길동");
int updateRecordCnt = getContentResolver().update(
Uri.parse(PROVIDER_URI),
updateRowValue,
"number=200106054",
null);
editText.setText("레코드 갱신 : " + updateRecordCnt);
break;
}
case R.id.delete:
{
int deleteRecordCnt = getContentResolver().delete(
Uri.parse(PROVIDER_URI),
null, null);
editText.setText("삭제된 레코드 수 : " + deleteRecordCnt);
break;
}
}
}
}
- [StudentDBManager.java] 작성 소스
package com.example.junho.example.provider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class StudentDBManager extends SQLiteOpenHelper {
static final String DB_STUDENTS = "Students.db";
static final String TABLE_STUDENTS = "Students";
static final int DB_VERSION = 2;
Context context = null;
private static StudentDBManager dbManager = null;
public static StudentDBManager getInstance(Context context){
if(dbManager == null){
dbManager = new StudentDBManager(context,DB_STUDENTS, null,DB_VERSION);
}
return dbManager;
}
private StudentDBManager(Context context, String dbName, SQLiteDatabase.CursorFactory factory, int version){
super(context,dbName,factory,version);
this.context = context;
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_STUDENTS + "(" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"number TEXT,"+
"name TEXT," +
"department TEXT," +
"age TEXT,"+
"grade INTEGER);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion < newVersion){
db.execSQL("DROP TABLE IF EXISTS " + TABLE_STUDENTS);
}
}
public long insert(ContentValues addRowValue){
return getWritableDatabase().insert(TABLE_STUDENTS,null,addRowValue);
}
public int insertAll(ContentValues[] values){
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
for(ContentValues contentValues : values){
db.insert(TABLE_STUDENTS,null,contentValues);
}
db.setTransactionSuccessful();
db.endTransaction();
return values.length;
}
public Cursor query(String [] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy){
return getReadableDatabase().query(TABLE_STUDENTS,columns,selection,selectionArgs,groupBy,having,orderBy);
}
public int update(ContentValues updateRowValue,String whereClause, String[] whereArgs){
return getWritableDatabase().update(TABLE_STUDENTS,updateRowValue,whereClause,whereArgs);
}
public int delete(String whereClause, String[] whereArgs){
return getWritableDatabase().delete(TABLE_STUDENTS,whereClause,whereArgs);
}
}
- [StudentProvider.java] 작성 소스
package com.example.junho.example.provider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
public class StudentProvider extends ContentProvider {
public StudentDBManager dbManager = null;
@Override
public boolean onCreate() {
dbManager = StudentDBManager.getInstance(getContext());
return true;
}
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
return dbManager.insertAll(values);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {
return dbManager.query(projection,selection,selectionArgs,null, null,sortOrder);
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long rowid = dbManager.insert(values);
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return dbManager.delete(selection,selectionArgs);
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
return dbManager.update(values,selection,selectionArgs);
}
}
- 결과
지금 까지 글을 읽어 주셔서 감사합니다.
혹시 모르시겠는 점이나 안되는 부분이 있다면 댓글로 문의 주세요~!
(안드로이드) 콘텐트 프로바이더 Uri란? (ContentProvider URI란?) (0) | 2019.01.29 |
---|---|
(안드로이드) 콘텐트벨류 클래스란? (ContentValues 클래스란?) (0) | 2019.01.29 |
(안드로이드) 콘텐츠 프로바이더 (Content Provider) (0) | 2019.01.28 |
(안드로이드) 레이아웃 인플레이션 및 인플레이터 (layout Inflation & inflator) (2) | 2019.01.28 |
(안드로이드 미션) TextWatcher 글자 수 실시간 표시하기 (0) | 2019.01.28 |