이전글 필요한분.

2012/02/10 - [Android Study] - Android database 만들기 6편 

변경 전
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        return null;
    }
변경 후 
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        switch(Matcher.match(uri)){
        case KIND_DATA :
          // 질의 요청 Cursor 형태로 return 됨 그리고 좀 찾아보면 좋은거 있음
          // GroupBy, 라던지 Having이라던지 이런것도 가능 하게 해줌 
 
            return mPracticeDB.query(PRACTICE_TABLE, projection, selection, selectionArgs, null, null, sortOrder);
        default :
            return null;
        }
    }
 
변경 전
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        return 0;
    }
변경 후 
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
       // DB에 없뎃한 갯수 
        int count = 0;

        switch(Matcher.match(uri)){
        case KIND_DATA :
          // 질의 요청 DB에 업뎃요청
            count = mPracticeDB.update(PRACTICE_TABLE, values, selection, selectionArgs);
            break;
        default :
            count = 0;
        }
       // URI에 DB 갱신했다고 알려줌
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    } 

으캬~ 겨우 ContentProvider 다 완성 헀다.
이제 사용법이 궁금 하지 않음요?
 
DB 추가.
ContentValues values = new ContentValues();
        values.put(PracticeColumns.DATA, "Hello");
        Uri resutlUri = getContentResolver().insert(PracticeColumns.CONTENT_URI, values); 

DB 업데이트 (ID 값이 1번인 내용을 업데이트 할때)
ContentValues values = new ContentValues();
        values.put(PracticeColumns.DATA, "Android");
        int result = getContentResolver().update(PracticeColumns.CONTENT_URI, values,
                           PracticeColumns.ID + " = 1", null);
 
DB 삭제.  (ID 값이 1번인 내용을 삭제 할때) 
        int result = getContentResolver().delete(PracticeColumns.CONTENT_URI,
                          PracticeColumns.ID + " = 1", null);

DB 질문.
Cursor cursor = getContentResolver().query(PracticeColumns.CONTENT_URI,
               new String[] {PracticeColumns.ID, PracticeColumns.DATA}, null, null, null); 

요롷게 쓰면 된당께... 으흐흐. 

'Android' 카테고리의 다른 글

LayoutInflater에 대하여...  (0) 2012.02.15
Cursor close 해야 하는 이유와 하는 방법.  (2) 2012.02.14
Android database 만들기 6편  (0) 2012.02.10
Android database 만들기 5편  (0) 2012.02.10
Android database 만들기 4편  (0) 2012.02.10
이전글 필요 한사람.
2012/02/10 - [Android Study] - Android database 만들기 5편


흐앙 이제 URI로 내껀지 니껀지 구분 가능 해졌으니, 데이터 추가, 삭제, 갱신, 질의 이런거
추가 해봐야지~ 냥냥.. 


변경 전
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }
변경 후
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
       // 삭제 한 갯수 
        int count = 0;

        switch(Matcher.match(uri)) {
        case KIND_DATA :
          // database에 삭제 요청
            count = mPracticeDB.delete(PRACTICE_TABLE, selection, selectionArgs);
            break;
        }
       // uri에 DB 갱신했다고 알려줌
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    } 

변경 전
    @Override
    public String getType(Uri uri) {
        return null;
    }
변경 후 
    @Override
    public String getType(Uri uri) {
        switch(Matcher.match(uri)) {
        case KIND_DATA :
       // 해석 해보면 vnd는 mimeType 시작 문구이고
       // paracitce.cursor값이고 이 값은 
/data 디렉토리를 가리킴
       // 뭐대충 이런뜻임 dir 말고 item도 있음 
            return "vnd.practice.cursor.dir/data";
        default :
            return null;
        }
    } 

변경 전
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }
변경 후 
    @Override
    public Uri insert(Uri uri, ContentValues values) {
       // 추가하고 리턴 받은 id값
        long id;

        switch(Matcher.match(uri)){
        case KIND_DATA :
          // Database에 추가.
            id = mPracticeDB.insert(PRACTICE_TABLE, null, values);
          // 완성된 URI 형태로 넘겨주기 위한 코드
            if( id > 0 ){
             // 정상대로 저장 했으면 uri에 noti를 해줌 DB 갱신 했다고 알려주는 것임
                Uri notiuri = ContentUris.withAppendedId(PracticeColumns.CONTENT_URI, id);
                getContext().getContentResolver().notifyChange(notiuri,null);
                return notiuri;
            }
            break;
        }
        return null;
    } 

움케케 너무 기니깐 담편으로 았싸 ㅋㅋ 12편 만들기 ㄱㄱㅆ ㅋㅋ 

'Android' 카테고리의 다른 글

Cursor close 해야 하는 이유와 하는 방법.  (2) 2012.02.14
Android database 만들기 7편  (0) 2012.02.10
Android database 만들기 5편  (0) 2012.02.10
Android database 만들기 4편  (0) 2012.02.10
Android database 만들기 3편  (0) 2012.02.10
전편... 필요한분
2012/02/10 - [Android Study] - Android database 만들기 4편 

아따 몹시 길구마이~

AndroidManifest 에 추가 해야 할 내용.

// 대충 설명하자면 Provider를 쓸껀데. Provider class 위치는 퍼랭이 글씨
// 지휘권? 같은 건데. 음 뭐랄까 내가 만들어 놓은 Provider class의 autorities 값이
// 빨갱이 글씨와 다르면 에러가 삑하고 남...
// 추가!! 내가 만든 provider 접근하려면 URI로 접근 해야하는데 그때 URI의 기본이
// 빨갱이 글씨임
// 예시 ) Uri.parser("content://com.practice.database/...");

    <provider android:name="com.android.provider.practice.AndroidProvider"
            android:authorities="com.practice.database"/>

위 내용까지 잘 정의 했다면 database 생성은 된것임.
그럼 data를 쓰고 지우고 갱신하는 code 작성이 매우 필요할 때임 ㅋㅋ 움케케케...
Android에서는 URI 라는 것으로 ContentProvider에 접근을 함.
접근을 하려면 일단은 URI 란 걸 구분 해야할 필요가 있음.
왜냐면 너도나도 URI를 쓰는데 내꺼는 뭔지 남꺼는 뭔지 구분해야 하지 않겠음??
곰곰히 생각해보면 아직 그런 코드 적어 준적이 없음... 고로 지금 부터 추가를 해야함.

4편에서 설명해준  private SQLiteDatabase mPracticeDB;  코드 밑에 다음 코드 추가요.

// UIR의 기본 string으로 사용됨. 위에  "com.practice.database와 같아야 함
private static final String AUTHORITIE = "com.practice.database";
// 나중에 Switch 문으로 사용될 구분값 (우리가 URI를 던지면 이 값으로 변경됨)
private static final int KIND_DATA = 1;
// URI를 던지면 AUTHORITIE 부분 제외하고 남은 부분을 가지고 INT 타입으로
// 변경 해주는 녀석. 
private static final UriMatcher Matcher;
static {
    Matcher = new UriMatcher(UriMatcher.NO_MATCH);
    Matcher.addURI(AUTHORITIE, "data", KIND_DATA);
}

너무 기니깐 담편으로 갑세다.. 

'Android' 카테고리의 다른 글

Android database 만들기 7편  (0) 2012.02.10
Android database 만들기 6편  (0) 2012.02.10
Android database 만들기 4편  (0) 2012.02.10
Android database 만들기 3편  (0) 2012.02.10
Android database 만들기 2편  (0) 2012.02.10
전편 필요 한분.
2012/02/10 - [Android Study] - Android database 만들기 3편 


기본 메소드 설명은 다했고 내부 class하고 interface 하고 변수 설명!!
자~ 들어 갑니다.

// android 내부 폴더에 저장 될 database 파일명
// 실제 위치는 /data/data/패키지명/databases/

private static final String DATABASE_NAME = "practice.db"; 
// Database 버전 ( DB upgrade와 관련있음)
// 숫자를 올리면 버전 업글 작업함.
private static final int DATABASE_VERSION = 1;
// Database 내부에 내가 쓸 table 명
private static final String PRACTICE_TABLE = "Practice";

// Database 객체
private SQLiteDatabase mPracticeDB;

// SQL문 쓸수 있게 해주는 class
private class PracticeDatabase extends SQLiteOpenHelper {
      // 생성자는 기본이니깐 버리고... 
        public PracticeDatabase(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
        }
 
     // 요기서 database 파일을 만듬
        @Override
        public void onCreate(SQLiteDatabase db) {
     // sql 명령어. 해석하면 "Practice라는 테이블을 생성하는데,
     // _id라는 놈은 정수 타입이고 기본 값이고 자동으로 증가 됨
     // data라는 놈은 text를 타입 임
            db.execSQL("create table " + PRACTICE_TABLE 
                    + " (" + PracticeColumns.ID + " integer primary key autoincrement, "
                    + PracticeColumns.DATA + " text);");
        }

     // 요기서 database 파일을 업뎃함
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
     // 해석하면 Practice 테이블이 있으면 버리고, 새로 만들어! 
            db.execSQL("DROP TABLE IF EXISTS " + PRACTICE_TABLE);
            onCreate(db);
        }
    }

   // 이거슨 컬럼을 좀 쉽게 쓰자는 배려!!
    public interface PracticeColumns {
     // 요고 붸리 임포턴트!! (내가 Practice 테이블로 접근 할수 있는 주소!)
     // 특히 빨간색 문구는 접근권한 구분 용도로 많이 쓰임
        public static final Uri CONTENT_URI = Uri.parse("content://com.practice.database/data");
     // id 컬럼 값
        public static final String ID = "_id";
     // data 컬럼 값
        public static final String DATA = "data";
    }

헥헥 좀 길다... 담편 ㄱㄱ

'Android' 카테고리의 다른 글

Android database 만들기 6편  (0) 2012.02.10
Android database 만들기 5편  (0) 2012.02.10
Android database 만들기 3편  (0) 2012.02.10
Android database 만들기 2편  (0) 2012.02.10
Android database 만들기 1편  (0) 2012.02.10
전편 필요한분.
2012/02/10 - [Android Study] - Android database 만들기 2편 

전편 코드가 좀 긴 관계로 부분 부분 나눠서 설명을 해야 겠음.

  @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
   
// Activity 나 혹은 Service 같은 곳에서 DB 삭제 요청하면 들어 오는 곳.
    // 예시 ) getContentResolver().delete(URI, null, null); 
        return 0;
    }

    @Override
    public String getType(Uri uri) {
    // URI를 질의 해서 해당 URI 의 Data Type이 뭔지 찾는 녀석 (이거 Intent 할때 사용됨)
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
    // Activity 나 혹은 Service 같은 곳에서 DB 추가 요청하면 들어 오는 곳.
    // 예시 ) getContentResolver().insert(URI, values); 
  
        return null;
    }

    @Override
    public boolean onCreate() {
     // 처음 생성 되는 곳 여기서 Database를 만들어야 함. 
        mPracticeDB = new PracticeDatabase(getContext(), DATABASE_NAME, 
                                   null, DATABASE_VERSION).getWritableDatabase();
     // DB 객체 상태에 따라서 false, true를 반환 하는데 true면 해당 class가 사용 가능 상태,       // false 면 해당 class가  사용 중지
        return (mPracticeDB == null)? false : true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
    // Activity 나 혹은 Service 같은 곳에서 DB 질의 요청하면 들어 오는 곳.
    // 예시 ) getContentResolver().query(URI, proiection, null, null, null); 
    
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
    // Activity 나 혹은 Service 같은 곳에서 DB 갱신 요청하면 들어 오는 곳.
    // 예시 ) getContentResolver().update(URI, values, null, null; 
  
        return 0;
    } 

위에 함수들은 ContentProvider를 상속받으면 기본적으로 적어야 하는 함수임.
붸리 임포턴트!! 

'Android' 카테고리의 다른 글

Android database 만들기 5편  (0) 2012.02.10
Android database 만들기 4편  (0) 2012.02.10
Android database 만들기 2편  (0) 2012.02.10
Android database 만들기 1편  (0) 2012.02.10
Android custom list 만들기 + separate 넣기 4편  (0) 2012.02.08
전편 필요한 분...
2012/02/10 - [Android Study] - Android database 만들기 1편 

요즘 내가 폭풍 글싸놓기를 하는 이유는??
- 급 한가해져서 ㅋㅋ 

전편에 프로젝트 상태를 봤을테니 이제는 실전 코드... 근대 좀 많이 큼..

일단 아무것도 안하고 Database 파일만 생성 하는 코드!!.


 public class AndroidProvider extends ContentProvider {
    private static final String DATABASE_NAME = "practice.db";
    private static final int DATABASE_VERSION = 1;
    private static final String PRACTICE_TABLE = "Practice";

    private SQLiteDatabase mPracticeDB;

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public boolean onCreate() {
        mPracticeDB = new PracticeDatabase(getContext(), DATABASE_NAME,
                                   null, DATABASE_VERSION).getWritableDatabase();

        return (mPracticeDB == null)? false : true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        return 0;
    }

    private class PracticeDatabase extends SQLiteOpenHelper {
        public PracticeDatabase(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table " + PRACTICE_TABLE
                    + " (" + PracticeColumns.ID + " integer primary key autoincrement, "
                    + PracticeColumns.DATA + " text);");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + PRACTICE_TABLE);
            onCreate(db);
        }
    }

    public interface PracticeColumns {
        public static final Uri CONTENT_URI = Uri.parse("content://com.practice.database/data");
        public static final String ID = "_id";
        public static final String DATA = "data";
    }
}


코드가 너무 크니깐.. 담편에 설명을 쩜쩜쩜 - 절대 편수 늘릴려는 꼼수가 아니라능... -
 
뭔가 이전 글 때문에 굳이 database 만들기를 말하려는 것 인거 같지만...
(흠 심증은 있으나 물증이 없는?...)

Android는 sqlite 라는 database system (?)를 제공 한다. 다들 알겠지만.
사용 방법도 다양하고 쉽게 쓸려면 마냥 쉽고 어렵게 쓸려면 또 어려운게 사실이다.

예전에 누군가를 도와주려고 그 사람 code를 본적이 있는데 그 사람은 Activity 에 
database 관련 내용을 다 넣어서 컨트롤 하던 상황이었다. (대체 어떻게 우겨 넣은거지??)
그래 놓고 다른 activity에서 사용 하고 싶다고 (나더러 어쩌라고?) 방법을 문의 하던 기억이...

이것 저것 다양하고 많은 방법이 있지만, 나는 가장 무난한 방법을 설명 할꺼임.


테이블 명은 Practice, 컬럼은 _id, data 를 가지는 database를 생성 할 것임.

손을 봐야 할 곳은 Database를 직접 컨트롤 하는 Provider class 와 AndroidManifest 두 개임.

현재 내 프로젝트 상태.



AndroidListAcitivity.java는 무시하고 눈여겨 봐야 할 것은 AndroidProvider.java 요녀석임.
Provider는 Activity들과 다르므로 다른 package(디렉토리)에 넣어 둘꺼임!


담편에 계속...

+ Recent posts