안드로이드 단말이나 아이폰같은 스마트폰에서는 데이터베이스를 기본으로 제공해서 앱이 단말에 데이터를 저장할 땐 대부분 데이터베이스를 사용한다.
모바일 데이터베이스?
앱을 만들면서 간단히 데이터를 저장하고 싶을 땐 SharedPreferences를 사용할 수 있다. 하지만 많은 양의 데이터를 체계적으로 관리하기 위해선 데이터베이스 사용이 훨씬 용이한데 표준 SQL문으로 데이터를 조회하는 관계형 디비를 단말에서 사용하면 아주 효율적이다.
안드로이드는 임베디드 데이터베이스로 개발된 경량급 관계형 DB인 SQLite를 가지고 있다. SQLite는 파일로 만들어진 하위 수준의 기능을 가지면서 DB 기능까지 그대로 사용할 수 있다. 또 저장될땐 파일로 저장되어서 DB의 복사,이동,삭제가 매우 쉽다는 장점이 있다. 또 큰 특징은 데이터 조회속도가 빠르고 표준 SQL을 지원한다는 점이다.
데이터베이스와 테이블 만들기
데이터베이스를 만드는 가장 간단한 방법은 Context 클래스에 정의된 openOrCreateDatabase()를 사용하는 것이다. Context클래스엔 이렇게 만든 DB를 지울 수 있는 deleteDatabase()도 정의되어 있어서 사용할 수 있다.
- public abstract SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase, CursorFactory factory) 에서 파라미터들은 순서대로 DB이름, 사용모드, 쿼리의 결과값으로 반환되는 데이터 참조하는 커서를 만들어낼 수 있는 객체가 전달된다. 이 method를 호출했을때 반환되는 SQLiteDatabase 객체는 name변수로 지정한 DB에 접근할 수 있는 method를 정의하고 있어서 이 메서드들로 DB를 열거나 만든 후에는 SQLiteDatabase를 참조해서 사용해야한다. 가장 중요한 method는 execSQL()로 SQL문을 실행할 때 사용된다.
public class sqlite extends AppCompatActivity {
EditText editText;
EditText editText2;
TextView textView;
SQLiteDatabase database;
String tableName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
editText = findViewById(R.id.editTextTextPersonName4);
editText2 = findViewById(R.id.editTextTextPersonName5);
textView = findViewById(R.id.textView13);
Button button = findViewById(R.id.button21);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String databaseName = editText.getText().toString();
createDatabase(databaseName);
}
});
Button button1 = findViewById(R.id.button22);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tableName = editText2.getText().toString();
createTable(tableName);
insertRecore();
}
});
}
private void createDatabase(String name){
println("database create");
database = openOrCreateDatabase(name, MODE_PRIVATE, null);
println("database created");
}
private void createTable(String name){
println("createTable");
if(database==null){
println("db make first");
return;
}
database.execSQL("create table if not exists "+name+"( _id integer PRIMARY KEY autoincrement, name text, age integer, mobile text)");
println("table created");
}
private void insertRecore(){
println("insert called");
if(database==null){
println("db make first");
return;
}
if(tableName==null){
println("db make first");
return;
}
database.execSQL("insert into "+tableName+"(name,age,mobile) values ('HJ', 20, '010-1111-1222')");
println("inserted");
}
public void println(String data){
textView.append(data+"\n");
}
}
위의 코드처럼 데이터베이스랑 테이블 만드는 것은 나름 간단해보인다. SQL method들에 SQL문을 string으로 넘겨주면 되는듯! id의 경우엔 안드로이드에서 _id로 만드는 방법을 권장한다고 한다. autoincrement를 붙여 자동으로 1씩 증가하게 해줬다.
** SQLite 관리 도구(GUI)를 사용하려면 DB browser for SQLite를 사용할 수 있다.
헬퍼 클래스로 업그레이드 지원
데이터베이스 만드는 것 외에도 테이블의 정의가 바뀌어서 스키마를 업그레이드할 필요가 있을땐 API에서 제공하는 헬퍼클래스를 사용할 수 있다. 헬퍼클래스는 SQLiteOpenHelper클래스를 사용하면 되고 , 안에 들어갈 파라미터는 context, string name, SQLiteDatabase.CursorFactory factory, int version이 있다. 세번째파라미터는 데이터조회시 반환하는 커서를 만들어낼 객체이다. 데이터베이스 파일이 만들어지도록 하려면 우선 getReadableDatabase()나 getWritableDatabase()를 호출해야하고 이 클래스를 이용할 때의 장점은 데이터베이스가 만들어지거나 업드레이드될때 콜백method가 호출된다는 점이다. 콜백메서드를 재정의해서 용도에 맞게 사용할 수 있다. onCreate, onOpen, onUpgrade등등...
현재의 데이터베이스 버전이 이미 사용하고 있는 SQLiteDatabase 파일의 버전과 다를 경우 자동으로 호출되는 onUpgrade에는 파라미터로 객체와함께 기존버전정보 가지고 있는 oldVersion, 현재 버전정보가진 newVersion이 전달된다. 만약 고객정보 관리하는 DB를 만든다면 SQLhelper를 상속해만든 내부클래스를 포함하는 customerDB를 만들 수 있다. Helper 클래스를 만들어두면 액티비티내에서 디비를 만들때 가져다쓰면돼서 코드가 간편해지는 장점이 있다.
데이터 조회하기
데이터를 조하기 위해 사용되는 표준 SQL은 select 를 사용하게 되는데 이 구문을 통해 반환되는 Cursor 객체를 받기 위해 rawQuery()를 실행한다. executeSQL()은 결과값이 없을때 rawQuery()는 결과값을 Cursor객체로 받을 수 있을때 사용하는 SQL실행방법이다! 실행한 뒤 Cursor는 결과테이블의 레코드를 순서대로 접근할 수 있고, moveToNext()를 사용해서 다음 레코드를 가리키도록 해야 레코드값을 가져올 수 있다.(처음엔 아무런 레코드를 가리키지 않아서 그렇다. 그래서 while을 써서 moveToNext()가 false될때까지 가져오는 방법을 일반적으로 사용한다고 한다.) 칼럼정보는 getColumnCount()를 써서 알 수 있고 getColumnNames()로 모든 칼럼의 이름들을 확인할 수 있다.
public void executeQuery(){
println("executeQuere called");
Cursor cursor = database.rawQuery("select _id, name,age,mobile from emp", null);
int recordCount=cursor.getCount();
println("count: "+recordCount);
for(int i=0;i<recordCount;i++){
cursor.moveToNext();
int id=cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
String mobile = cursor.getString(3);
println("record: "+i+" : "+id+", "+name+", "+age+", "+mobile);
}
cursor.close();
}
'안드로이드' 카테고리의 다른 글
위치기반 서비스 이용. 내 위치 알려주기. (1) | 2021.05.06 |
---|---|
내용 제공자 (1) | 2021.05.04 |
웹 요청, Volley 사용, Json 다뤄보기 (0) | 2021.04.28 |
서버에 데이터 요청 후 응답받기 - 소켓 (0) | 2021.04.28 |
스레드와 핸들러 (1) | 2021.04.26 |
댓글