본문 바로가기
프로그래밍/부스트코스

부스트 코스 에이스 미션 5 (SQLITE, DataBase, 개선사항)

by 돌및쓰고 2019. 8. 30.

1. SQLite

DBHelper

싱글톤 패턴으로 하나의 객체만 생성

Context를 Activity나  Service의 Context를 보내줄경우 메모리가 낭비 될수있으므로 이런부분에서는

Application Context를 넘겨주는 것이 좋음

public class DBHelper extends SQLiteOpenHelper {
    public static final int DB_VERSION = 1;
    public static final String DBFILE_CONTACT = "cineheaven.db";
    private static DBHelper instance = null;
    private DBHelper(Context context) {
        super(context, DBFILE_CONTACT, null, DB_VERSION);
    }

    public static SQLiteOpenHelper getInstance(Context context){
        if(instance == null)
            instance = new DBHelper(context);
        return instance;
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL(MovieDBCtrct.SQL_CREATE_TBL);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // db.execSQL(ContactDBCtrct.SQL_DROP_TBL) ;
        onCreate(db);
    }

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // onUpgrade(db, oldVersion, newVersion);
    }
}

테이블별 DB클래스 실질적 SQL과 컬럼을 상수로 지정

public class CommentDBCtrct {

    private CommentDBCtrct() {
    }

    public static final String TBL_CONTACT = "COMMENT";
    public static final String COL_POST_ID = "POST_ID";
    public static final String COL_WRITER = "WRITER";
    public static final String COL_REVIEW_ID = "REVIEW_ID";
    public static final String COL_WRITER_IMAGE = "WRITER_IMAGE";
    public static final String COL_TIME = "TIME";
    public static final String COL_TIMESTAMP = "TIMESTAMP";
    public static final String COL_RATING = "RATING";
    public static final String COL_CONTENTS = "CONTENTS";
    public static final String COL_RECOMMEND = "RECOMMEND";

    public static List getItem(SQLiteDatabase db, int postId) {
        Cursor cursor = db.rawQuery("SELECT * FROM "+TBL_CONTACT+" WHERE REVIEW_ID="+postId, null);

        List<ReadCommentItem> list = new ArrayList<>();
        for(int i=0;i<cursor.getCount();i++)
            if(cursor.moveToNext())
            {
                ReadCommentItem item = new ReadCommentItem();
                item.id =cursor.getInt(0);
                item.writer =cursor.getString(1);
                item.movieId =cursor.getInt(2);
                item.writer_image =cursor.getString(3);
                item.time =cursor.getString(4);
                item.timestamp=cursor.getLong(5);
                item.rating=cursor.getFloat(6);
                item.contents =cursor.getString(7);
                list.add(item);
            }
        Log.d("db","getSize : "+list.size());
        return list;
    }

    public static void insertItem(SQLiteDatabase db, List<ReadCommentItem> list) {
        db.execSQL(CommentDBCtrct.SQL_CREATE_TBL);
        for (int i = 0; i < list.size(); i++) {
            ReadCommentItem item = list.get(i);
            String sql = "(";
            sql += item.id + ",";
            sql += "'" + item.writer + "',";
            sql += "" + item.movieId + ",";
            sql += "'" + item.writer_image + "',";
            sql += "'" + item.time + "',";
            sql += "" + item.timestamp + ",";
            sql += "" + item.rating + ",";
            sql += "'" + item.contents + "',";
            sql += "" + item.recommend + ")";
            db.execSQL(SQL_INSERT + sql);
        }

        Log.d("db","insert : "+list.size());
    }

    // CREATE TABLE IF NOT EXISTS CONTACT_T (NO INTEGER NOT NULL, NAME TEXT, PHONE TEXT, OVER20 INTEGER)
    public static final String SQL_CREATE_TBL = "CREATE TABLE IF NOT EXISTS " + TBL_CONTACT + " " +
            "(" +
            COL_POST_ID + " INTEGER NOT NULL PRIMARY KEY" + ", " +
            COL_WRITER + " TEXT" + ", " +
            COL_REVIEW_ID + " INTEGER NOT NULL " + ", " +
            COL_WRITER_IMAGE + " TEXT" + ", " +
            COL_TIME + " TEXT" + ", " +
            COL_TIMESTAMP + " TIMESTAMP" + ", " +
            COL_RATING + " FLOAT NOT NULL," +
            COL_CONTENTS + " TEXT ," +
            COL_RECOMMEND + " INTEGER NOT NULL" +
            ")";

    // DROP TABLE IF EXISTS CONTACT_T
    public static final String SQL_DROP_TBL = "DROP TABLE IF EXISTS " + TBL_CONTACT;

    // SELECT * FROM CONTACT_T
    public static final String SQL_SELECT = "SELECT * FROM " + TBL_CONTACT;

    // INSERT INTO person VALUES(NULL, 15, 'James', 'Barkely')
    //    ON DUPLICATE KEY UPDATE academy_id = VALUES(academy_id);
    // INSERT OR REPLACE INTO CONTACT_T (NO, NAME, PHONE, OVER20) VALUES (x, x, x, x)
    public static final String SQL_INSERT = "INSERT OR IGNORE INTO " + TBL_CONTACT + " " +
            "(" +
                COL_POST_ID + "," +
                COL_WRITER + "," +
                COL_REVIEW_ID + "," +
                COL_WRITER_IMAGE + "," +
                COL_TIME + "," +
                COL_TIMESTAMP + "," +
                COL_RATING + "," +
                COL_CONTENTS + "," +
                COL_RECOMMEND +
            ") VALUES ";

    // DELETE FROM CONTACT_T
    public static final String SQL_DELETE = "DELETE FROM " + TBL_CONTACT;
}

2. Glide 

Glide를 이용해 로컬에 이미지 저장하는 방식

https://stackoverflow.com/questions/44761720/save-pictures-in-device-glide-library

 

save pictures in device [Glide Library]

i'm trying to add Download Feature to my application i 'm using Glide Library to downlaod the pictures from their url This is the code from which I save an picture in device storage but not working...

stackoverflow.com

3. 개선사항 

 

1. 접근제어자 잘붙이기

 -귀찮아도 생각하고 붙이자
2. string.xml 활용

- 네이밍이 너무 어렵다.
3. 변수명에 언더바쓰지않기

- 전혀 몰랏던내용 앞으로 숙지하자

4. 액티비티간 데이터공유 방법 고민

- static으로 불러오는 방식이 맞는지 고민중

5. getInstance는 싱글톤 객체에만 사용

6, e.printstacktrace 지양 - 성능 및 보안에 취약함 관련내용 포스팅

7. 클래스를 좀더 세분화하여 코드분석시에 결과만 신경쓸 수 있도록 수정

8. getcontext or this 대신 applicationcontext를 전달하여 사용하는것이 좋음

9. gson의 typetoken메소드 방식 고려

 

 

댓글