NOW OR NEVER

[Android] Resource & SQLiteDataBase 본문

Android

[Android] Resource & SQLiteDataBase

LAURA 2023. 7. 5. 17:52
반응형

 

Resource

  • res 내 폴더들은 반드시 구글에서 무슨 용도로 사용하는 지 정해져 있는 폴더들(폴더 이름이 다 지정되어 있다)이다.
  • 안드로이드 os에서 용도가 정해져 있지 않은 파일들(폰트,음악, 영상, 텍스트 등)을 프로젝트에 넣어 사용할 경우 그 파일들을 넣어두는 곳이 raw와 assets에 넣어둔다

raw

  • 가공되지 않은 원천 데이터
  • 각종 데이터 파일이나 동영상, 사운드 등 담는 폴더
  • 다양한 파일들을 포함시킬 수 있지만 개수가 적은 것들만 담을 수 있다.
  • 장단점
    • 장점 : stream을 추출하는 코드를 작성하는 것이 쉽다
    • 단점 : 하위 폴더를 만들 수 없다.
  • raw 파일과 연결된 stream 추출 방법
    • val inputStream = resources.openRawResource(R.raw.data)

assets

  • 폴더 생성 : app - 마우스 우클릭 - new - folder - Assets Folder
  • res 폴더 안에 존재하지 않음
  • 폴더 이름을 자유롭게 작성할 수 있다.
  • raws 폴더가 다양한 파일들을 넣어서 쓰라고 존재하지만 하위 폴더로 나눠서 관리해야 한다면 하위 폴더를 관리할 수 있는 assets에 넣어 사용하는 것이 좋다.
  • 장단점
    • 장점 : 하위 폴더 만들기 가능
    • 단점 : 코드를 작성하는 것이 raw보단 길다(번거롭다)
  • 개수가 많고 폴더 별로 구분해야 하는 경우 assets에 담음
  • 추출방법
    • val inputStream = assets.open("assets내 폴더이름/파일이름.확장자")
  • Assets 폴더에 있는 폰트 파일을 이용해 폰트 객체를 생성 : val typeFace = Typeface.createFromAsset(assets, "assets 내 폰트 위치")

SQLiteDataBase

  • data는 단말기 내부의 파일 형태로 저장
  • 내장메모리에서 sqlitedatabase패키지로 만든 데이터베이스가 저장된 위치 : Device File Explorer - data/data/com.test.android69_sqlitedatabase1 :
  • database
    • 데이터를 모아놓은 데이터 집합체
    • 대용량 데이터를 쉽고 빠르게 관리할 수 있게 하는 것
    • 데이터를 저장하는 이유는 데이터를 사용하기 위함이니까 내가 얼마나 데이터를 쉽고 빠르고 편하게 사용할 수 있는 가가 중요하다. 그래서 데이터베이스를 사용한다.
    • dbms : 오라클 등
  • 네트워크
    • 소켓 통신 방식
    • 백엔드 서버 통신 방식 : 데이터베이스를 잘 알아야한다.
  • MySQL과 유사한 문법 사용
  • SQLitesDataBase는 내장 데이터 베이스이다 : 별도의 프로그램을 설치하지 않고 라이브러리 형태로 되어있다. 즉 코드형태로 되어 있다(파일형태로 저장되어 있음). 단말기 내부 안에서만 사용 가능하다. 어플리케이션 삭제 되면 같이 삭제 된다.
  • firefox가 해당 데이터베이스를 사용하고 있다.
  • 구성 방법
    • onCreate : 어플리케이션을 처음 받아서 까는 사람들을 위한 것, 항상 데이터베이스를 최신버전으로 만들 수 있도록한다.
    • onUpgrade: 데이터베이스 변경 시 업데이트 해준다.
// Test.db : 사용할 데이터 베이스 파일의 이름
// null : NullFactory, Null에 대한 처리
// 1 : 버전
class DBHelper(context:Context) : SQLiteOpenHelper(context, "Test.db", null, 1) {
    override fun onCreate(sqliteDatabase: SQLiteDatabase?) {
        // 테이블의 구조를 정의
        val sql = """create table TestTable
            (idx integer primary key autoincrement,
            textData text not null,
            intData integer not null,
            doubleData real not null,
            dateData date not null)
        """.trimIndent()
        // 쿼리문을 수행
        sqliteDatabase?.execSQL(sql)
    }

    override fun onUpgrade(sqliteDatabase: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    }
}

 

 

DAO

  • 구성 메서드
    • Create : 저장
    • Read Condition : 조건에 맞는 행 하나를 가져온다.
    • Read All : 모든 행을 가져온다
    • Update : 조건에 맞는 행의 컬럼의 값을 수정한다.
    • Delete : 조건 맞는 행을 삭제한다.
  • 쿼리로 직접 작성하는 방법
// Create : 저장
fun insertData(context: Context, data:TestClass ){
    // autoincrement가 있는 컬럼은 제외하고 나머지만 지정한다.
    val sql = """insert into TestTable
        | (textData, intData, doubleData, dateData)
        | values (?, ?, ?, ?)
    """.trimMargin()

    // ? 에 설정할 값을 배열에 담아준다.
    val arg1 = arrayOf(
        data.textData, data.intData, data.doubleData, data.dateData
    )
    // 데이터베이스 오픈
    val sqliteDatabase = DBHelper(context)
    // 쿼리 실행 (쿼리문, ?에 셋팅할 값 배열)
    sqliteDatabase.writableDatabase.execSQL(sql, arg1)
    // 데이터 베이스를 닫아준다.
    sqliteDatabase.close()
}

// Read Condition : 조건에 맞는 행 하나를 가져온다.
fun selectData(context: Context, idx:Int): TestClass {
    // 쿼리문
    val sql = "select * from TestTable where idx=?"
    // ?에 들어갈 값 (문열 배열)
    val arg1 = arrayOf("{$idx}")

    // 데이터베이스 오픈
    val dbHelper = DBHelper(context)
    // 쿼리실행
    val cursor = dbHelper.writableDatabase.rawQuery(sql, arg1)

    // 컬럼의 이름을 지정하여 컬럼의 순서값을 가져온다.
    val idx1 = cursor.getColumnIndex("idx")
    val idx2 = cursor.getColumnIndex("textData")
    val idx3 = cursor.getColumnIndex("intData")
    val idx4 = cursor.getColumnIndex("doubleData")
    val idx5 = cursor.getColumnIndex("dateData")

    // 데이터를 가져온다.
    val idx = cursor.getInt(idx1)
    val textData = cursor.getString(idx2)
    val intData = cursor.getInt(idx3)
    val doubleData = cursor.getDouble(idx4)
    val dateData = cursor.getString(idx5)

    val testClass = TestClass(idx, textData, intData, doubleData, dateData)

    dbHelper.close()
    return testClass
}

// Read All : 모든 행을 가져온다
fun selectAllData(context: Context):MutableList<TestClass>{
    // 모든 행을 가져오는 쿼리문을 작성한다.
    val sql = "select * from TestTable"

    // 데이터베이스 오픈
    val dbHelper = DBHelper(context)
    // 쿼리 실행
    val cursor = dbHelper.writableDatabase.rawQuery(sql, null)
    // cursor 객체는 쿼리문에 맞는 행에 접근할 수 있는 객체가 된다.
    // 처음에는 아무 행도 가르치고 있지 않는다.
    // moveToNext 메서드를 호출하면 다음 행에 접근할 수 있다.
    // 이때 접근할 행이 있으면 true를 반환하고 없으면  false를 반환한다.

    val dataList = mutableListOf<TestClass>()

    while(cursor.moveToNext()){
        // 컬럼의 이름을 지정하여 컬럼의 순서값을 가져온다.
        val idx1 = cursor.getColumnIndex("idx")
        val idx2 = cursor.getColumnIndex("textData")
        val idx3 = cursor.getColumnIndex("intData")
        val idx4 = cursor.getColumnIndex("doubleData")
        val idx5 = cursor.getColumnIndex("dateData")

        // 데이터를 가져온다.
        val idx = cursor.getInt(idx1)
        val textData = cursor.getString(idx2)
        val intData = cursor.getInt(idx3)
        val doubleData = cursor.getDouble(idx4)
        val dateData = cursor.getString(idx5)

        val testClass = TestClass(idx, textData, intData, doubleData, dateData)
        dataList.add(testClass)
    }

    dbHelper.close()

    return dataList
}

// Update : 조건에 맞는 행의 컬럼의 값을 수정한다.
fun updateData(context:Context, obj:TestClass){
    // 쿼리문
    // idx가 ? 인 행의 textData, intData, doubleData, dateData 컬럼의 값을 변경한다
    val sql = """update TestTable
        | set textData=?, intData=?, doubleData=?, dateData=?
        | where idx=?
    """.trimMargin()

    // ? 에 들어갈 값
    val args = arrayOf(obj.textData, obj.intData, obj.doubleData, obj.dateData, obj.idx)
    // 쿼리 실행
    val dbHelper = DBHelper(context)
    dbHelper.writableDatabase.execSQL(sql, args)
    dbHelper.close()
}

// Delete : 조건 맞는 행을 삭제한다.
fun deleteData(context:Context, idx:Int){
    // 쿼리문
    // TestTable에서 idx가 ? 인 행을 삭제한다.
    val sql = "delete from TestTable where idx = ?"
    // ?에 들어갈 값
    val args = arrayOf(idx)
    // 쿼리 실행
    val dbHelper = DBHelper(context)
    dbHelper.writableDatabase.execSQL(sql, args)
    dbHelper.close()
}

 

 


etc

  • 사운드 관리 객체 : MediaPlayer
  • 저작권
    • 이미지 사용 주의 특히 사람 얼굴 나와있는 이미지 쓸 때 주의 : 반드시 어디서 가져왔는 지 명시 및 사용해도 되는 지 해당 저작권자에게 확인
    • 폰트
      • 폰트의 경우 기업에서 제공하는 폰트(현대카드 유앤아이 폰트, 우아한 형제 폰트 등) 추천 or 나눔 폰트 : 폰트 사용하는 경우 메일 보내서 써도 되는 지 확인
      • ttf는 비트맵 방식, otf는 백터 방식
      • 어플의 확대 축소 기능 없다면 웬만하면 다 ttf 폰트 사용 권장
      • ttf와 otf 둘 다 윈도우 맥 둘다 사용 가능
      • 폰트 더블 클릭 시 예시가 알파벳만 나와있는 폰트는 영문만 지원
  • .trimIndent() : 문자열의 공백을 다 제거해서 한 줄로 만들어주는 코틀린에서 제공하는 메서드
  • 데이터베이스에 들어가는 데이터가 날짜형식일 경우는 문자열로 받기
Comments