상세 컨텐츠

본문 제목

(안드로이드) 콘텐트 프로바이더(ConentProvider)를 학생 DB 예제 (ContentProvider)

Android

by choiDev 2019. 1. 28. 18:07

본문

콘텐트 프로바이더(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);
}
}



  - 결과



지금 까지 글을 읽어 주셔서 감사합니다.

혹시 모르시겠는 점이나 안되는 부분이 있다면 댓글로 문의 주세요~!


관련글 더보기