프로그래밍/부스트코스

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

돌및쓰고 2019. 8. 30. 01:15

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메소드 방식 고려