컴퓨터공부/Android

Android SQLite query 공부 하기

achivenKakao 2020. 9. 13. 15:42

제가 내린 결론은 "Android SQLite query는 결과적으로 sql query를 쓸 수 있어야 한다." 입니다.

아래 출처에 나온 것 공부 하면서 느낀 건 결국 db.execSQL() 과 db.lowquery() 를 써야 하고, sql을 모르면 이게 뭔지 모를 공산이 크다.

몇몇 create table, delete from table, drop table 은 별도로 봐줘야 할 필요가 있지만 그래도 기본은 sql query이다.

왜냐 하면 sql query를 이해하고 이걸 코딩하는 방식으로 변환 하면 끝이기 때문입니다.

아래 코드를 보시면 제가 무슨 말을 하는지 이해가 가실겁니다.

// Table create
String studentSql= "create table " + TB_STUDENT + 
                  " ( " + COLUMN_ID + " integer primary key autoincrement," +
        COLUMN_NAME + " not null," +
        COLUMN_EMAIL + "," +
        COLUMN_PHONE + "," +
        COLUMN_PHOTO + ")";

// or
String studentSql = String.format(Locale.US,
"create table %s ('%s' integer primary key autoincrement, '%s' text not null, '%s' text, '%s' text, '%s' text)",
    TB_STUDENT,
    COLUMN_ID,
    COLUMN_NAME,
    COLUMN_EMAIL,
    COLUMN_PHONE,
    COLUMN_PHOTO
);


/*
sql query로 표현
CREATE TABLE "tb_student2" (
    "_id"    INTEGER PRIMARY KEY AUTOINCREMENT,
    "name"    TEXT NOT NULL,
    "email"    TEXT,
    "phone"    TEXT
);

혹은 
CREATE TABLE 'tb_student2' (
    '_id'    INTEGER PRIMARY KEY AUTOINCREMENT,
    'name'    TEXT NOT NULL,
    'email'    TEXT,
    'phone'    TEXT
);

// 참고로 큰 따옴표는 space를 사용하고 싶을 때만 사용할 수 있습니다.
If you must use spaces, you will need to use double quotes.

아래 AS 처럼 별명을 쓸 때만 사용하고 다른 곳에서는 모두 작은 따옴표를 사용합니다.(안 그럼 에러남)

SELECT COUNT(date) AS "Count Of Date"
FROM tutorial.aapl_historical_stock_price
*/

///////////////////////////////////////////////////////
// insert row
DBHelper helper = new DBHelper(AddStudentActivity.this);
SQLiteDatabase db = helper.getWritableDatabase();

ContentValues cv = new ContentValues();
cv.put(COLUMN_NAME, name);
cv.put(COLUMN_EMAIL, email);
cv.put(COLUMN_PHONE, phone);

long newRowId = db.insert(TB_STUDENT, null, cv);

/*
sql query로 표현가능하지만 android API를 사용하는 걸 추천(rawQuery()를 쓰기 복잡)
INSERT INTO tb_student2 
VALUES (null, "input name", "input email", "010~");

참고 : https://stackoverflow.com/questions/7470739/how-to-use-rawquery-method-to-insert-a-record
*/

///////////////////////////////////////////////////////
// delete row
String queryString = 
    "delete from " + TB_STUDENT + " where " + COLUMN_ID + " = " + studentVO.getId();

//or 
String queryString = String.format(Locale.US, "delete from %s where %s = %d", TB_STUDENT, COLUMN_ID, studentVO.getId());
Cursor cursor = db.rawQuery(queryString, null);
if(cursor.moveToFirst()){
    cursor.close();
    db.close();
    return true;
}
cursor.close();
db.close();
return false;
/*
sql query로 표현
DELETE FROM tb_student2
WHERE _id = 2
*/

///////////////////////////////////////////////////////
// drop table
db.execSQL("drop table " + TB_STUDENT);


/*
sql qeury로 표현
DROP TABLE tb_student2
*/

공부 방법은 일단 https://mode.com/sql-tutorial/sql-select-statement/ 가서 가입하십니다.

그리고 설명을 이해하고 제공되는 sql 가상 command를 이용해서 연습 문제를 푸시면 됩니다.(영어 압박은 심하지 않은데.. 구글 번역 쓰시면 도움이 됩니다;)

별도로 쿼리를 연습하고 싶으면 DB Browser for SQLite 를 까셔서 연습하시면 됩니다.

DB Browser for SQLite 에 대한 자세한 설명은 이 링크에서 확인해 주세요.

DB Browser for SQLite

참고로 이 툴로 안드로이드 앱에서 추출된 db table을 볼 수 있습니다.(www.youtube.com/watch?v=hDSVInZ2JCs&feature=youtu.be 55분 경 참고 )

끝.

덧. select와 where의 차이

select와 where의 산술 표현

    where는 논리 표현만 가능
    select는 논리, 산술 표현이 가능


    where 의 경우
        불가능 WHERE year +1
        가능 WHERE year > 2000

    select 의 경우
        산술
        SELECT year + 1 AS "One Year more",   -- 결과는 year에 1년이 더 해짐
               month
        FROM tutorial.us_housing_units
        WHERE year >=2000

        논리
        SELECT year > 2000 AS "One Year more",    -- 결과는 true/false
               month
        FROM tutorial.us_housing_units

출처 :

SQLite + RecyclerView

https://youtu.be/hDSVInZ2JCs

https://youtu.be/5ISNPFmuOU8

www.youtube.com/watch?v=kDZES1wtKUY sql update, delete 포함

SQLite + ListView

https://youtu.be/R8JygGTpEyU

SQLite query

https://brunch.co.kr/@minu-log/5

https://mode.com/sql-tutorial/sql-select-statement/

stackoverflow.com/questions/7470739/how-to-use-rawquery-method-to-insert-a-record