반응형
Notice
Recent Posts
Recent Comments
Link
NOW OR NEVER
[Android] Resource & SQLiteDataBase 본문
반응형
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() : 문자열의 공백을 다 제거해서 한 줄로 만들어주는 코틀린에서 제공하는 메서드
- 데이터베이스에 들어가는 데이터가 날짜형식일 경우는 문자열로 받기
'Android' 카테고리의 다른 글
[Android] Fragment에서의 toolbar 내 뒤로 가기 버튼 구현 (0) | 2023.07.06 |
---|---|
[Android] AndroidX 패키지가 작동하지 않는 오류 해결 (0) | 2023.07.06 |
[Android] File I/O (0) | 2023.07.04 |
[Android] 안드로이드 스튜디오 Mac 클릭 및 커서 Error (0) | 2023.07.04 |
[Android] Layout (0) | 2023.07.03 |
Comments