티스토리 뷰

Android

[Android] Android SQLite

best 2016. 8. 4. 16:03

안드로이드 SQLite


SQLite ?


SQLite는 모바일 환경에 최적화된 데이터베이스로, 안드로이드에 내장되어 있어 간단한 데이터베이스를 생성하여 사용할 수 있다.


( 서버를 사용하지 않고 단말기 내에서만 처리되는 가벼운 데이터베이스이다. )


SQLite를 사용하기 위해서는 도우미 클래스인 SQLiteOpenHelper를 상속받아서 사용하는 방법이 있다.


onCreate()는 생성자에서 넘겨받은 이름과 버전을 체크하여 데이터베이스가 존재하지 않을 때 한번 호출 된다. 

(새로운 데이터베이스를 생성할 때 호출)


onUpgrade() 함수는 데이터베이스가 존재하지만 버전이 수정되었을 때 호출된다.


SQLite 예제


SQLiteOpenHelper를 상속받는 DBHelper를 생성하였다.


DBHelper.java


package com.ktds.jmj.mydatabase.DB;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;

import com.ktds.jmj.mydatabase.VO.Person;

import java.util.ArrayList;
import java.util.List;

/**
* Created by 206-020 on 2016-06-20.
*/
public class DBHelper extends SQLiteOpenHelper { // Ctrl + i 눌러서 추가

public static final int DB_VERSION = 2;

private Context context;

public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}

/**
* 데이터베이스가 존재하지 않을 때, 딱 한번 실행된다.
* DB를 만드는 역할을 한다.
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {

StringBuffer sb = new StringBuffer();
sb.append(" CREATE TABLE TEST_TABLE ( " );
sb.append(" _ID INTEGER PRIMARY KEY AUTOINCREMENT, " );
sb.append(" NAME TEXT, " );
sb.append(" AGE INTEGER, " );
sb.append(" PHONE TEXT, " );
sb.append(" ADDRESS TEXT ); " );

db.execSQL(sb.toString());

Toast.makeText(context, "Table 생성됨" , Toast.LENGTH_SHORT).show();

}

/**
* Application 의 버전이 올라가 Table 구조가 변경 되었을 때, 실행된다.
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

if ( oldVersion == 1 && newVersion == 2 ){
StringBuffer sb = new StringBuffer();
sb.append(" ALTER TABLE TEST_TABLE ADD ADDRESS TEXT ");
db.execSQL(sb.toString());

Toast.makeText(context, "Version 올라간다." , Toast.LENGTH_SHORT).show();
}
// else if ( oldVersion == 1 && newVersion == 3 ) {
//
// }
}

public void testDB() {
SQLiteDatabase db = getReadableDatabase();
}

public void addPerson(Person person) {
// 1. 쓰기 가능한 DB 객체를 가져온다.
SQLiteDatabase db = getWritableDatabase();

// 2. Person Data Insert 한다.
StringBuffer sb = new StringBuffer();
sb.append(" INSERT INTO TEST_TABLE ( ");
sb.append(" NAME, AGE, PHONE, ADDRESS )");
sb.append(" VALUES ( ?, ?, ?, ? )" );
// sb.append(" VALUES ( #NAME#, #AGE#, #PHONE# ) ");
//
// String query = sb.toString();
// query = query.replace("#NAME#", "'" + person.getName() + "'");
// query = query.replace("#AGE#", person.getAge() );
// query = query.replace("#PHONE#", "'" + person.getPhone() + "'");
//
// db.execSQL(query);
db.execSQL( sb.toString(), new Object[]{ person.getName(), Integer.parseInt(person.getAge()), person.getPhone(), person.getAddress() } );
Toast.makeText(context, "Insert 완료", Toast.LENGTH_SHORT).show();
}

public List<Person> getAllPersons(){

StringBuffer sb = new StringBuffer();
sb.append(" SELECT _ID, NAME, AGE, PHONE, ADDRESS FROM TEST_TABLE ");

// 읽기 전용 DB 객체를 가져온다.
SQLiteDatabase db = getReadableDatabase();

// Select 해 온다.
Cursor cursor = db.rawQuery(sb.toString(), null);

List<Person> persons = new ArrayList<Person>();

Log.d("RESULT", cursor.getCount() + "");

Person person = null;
while ( cursor.moveToNext() ) {
person = new Person();
person.set_id(cursor.getInt(0));
person.setName(cursor.getString(1));
person.setAge(cursor.getString(2));
person.setPhone(cursor.getString(3));
person.setAddress(cursor.getString(4));

persons.add(person);
}

return persons;

}

public Person getDetailPerson(String id) {
SQLiteDatabase db = getReadableDatabase();

// StringBuffer sb = new StringBuffer();
// sb.append(" SELECT _ID, NAME, AGE, PHONE, ADDRESS FROM TEST_TABLE WHERE _ID = " + id);
String[] columns = {"_ID", "NAME", "AGE", "PHONE", "ADDRESS"};
String[] params = { id };
// Cursor cursor = db.rawQuery(sb.toString(), null);

Cursor cursor = db.query("TEST_TABLE", columns, "_ID = ?", params, null, null, null);
cursor.moveToNext();

Person person = new Person();

person.set_id(cursor.getInt(0));
person.setName(cursor.getString(1));
person.setAge(cursor.getString(2));
person.setPhone(cursor.getString(3));
person.setAddress(cursor.getString(4));

return person;
}
}



여기서 insert, delete, select 등의 작업을 함수로 작성하면 된다.


MainActivity.java


package com.ktds.jmj.mydatabase;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.ktds.jmj.mydatabase.DB.DBHelper;
import com.ktds.jmj.mydatabase.VO.Person;

import java.util.List;

public class MainActivity extends AppCompatActivity {


private Button btnCreateDatabase;
private Button btnInsertData;
private Button btnSelectAllDatas;

private ListView lvPersons;

private DBHelper dbHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnCreateDatabase = (Button) findViewById(R.id.btnCreateDatabase);
btnCreateDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

lvPersons.setVisibility(View.INVISIBLE);

final EditText etDBName = new EditText(MainActivity.this);
etDBName.setHint("DB명을 입력하세요.");

// Dialog database 의 이름을 입력 받는다.
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);

dialog.setTitle("Database 이름을 입력하세요.")
.setMessage("Database 이름을 입력하세요.")
.setView(etDBName)
.setPositiveButton("생성", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

if ( etDBName.getText().toString().length() > 0 ){
dbHelper = new DBHelper(MainActivity.this, etDBName.getText().toString(), null , DBHelper.DB_VERSION);
dbHelper.testDB();
}
// Toast.makeText(MainActivity.this, etDBName.getText(), Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
})
.create().show();

}
});

btnInsertData = (Button) findViewById(R.id.btnInsertData);
btnInsertData.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {

lvPersons.setVisibility(View.INVISIBLE);

LinearLayout layout = new LinearLayout(MainActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);

final EditText etName = new EditText(MainActivity.this);
etName.setHint("이름을 입력하세요.");

final EditText etAge = new EditText(MainActivity.this);
etAge.setHint("나이를 입력하세요.");

final EditText etPhone = new EditText(MainActivity.this);
etPhone.setHint("전화번호를 입력하세요.");

final EditText etAddress = new EditText(MainActivity.this);
etAddress.setHint("주소를 입력하세요.");


layout.addView(etName);
layout.addView(etAge);
layout.addView(etPhone);
layout.addView(etAddress);


AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setTitle("정보를 입력하세요.")
.setView(layout)
.setPositiveButton("등록", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String name = etName.getText().toString();
String age = etAge.getText().toString();
String phone = etPhone.getText().toString();
String address = etAddress.getText().toString();

if ( dbHelper == null ) {
dbHelper = new DBHelper(MainActivity.this, "TEST", null, DBHelper.DB_VERSION);
}

Person person = new Person();
person.setName(name);
person.setAge(age);
person.setPhone(phone);
person.setAddress(address);

dbHelper.addPerson(person);

// Toast.makeText(MainActivity.this, name + " / " + age + " / " + phone, Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
})
.create().show();
}
});

lvPersons = (ListView) findViewById(R.id.lvPersons);
btnSelectAllDatas = (Button) findViewById(R.id.btnSelectAllDatas);
btnSelectAllDatas.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// ListView 를 보여준다.
lvPersons.setVisibility(View.VISIBLE);

// 1. Person Data 를 모두 가져온다.
if ( dbHelper == null ) { // dbHelper null 이라면 초기화시킨다.
dbHelper = new DBHelper(MainActivity.this, "TEST", null, DBHelper.DB_VERSION);
}

List<Person> persons = dbHelper.getAllPersons();

// 2. ListView Person 데이터를 모두 보여준다.
lvPersons.setAdapter(new PersonListAdapter(persons, MainActivity.this));

}
});
}

private class PersonListAdapter extends BaseAdapter{

private List<Person> persons;
private Context context;

public PersonListAdapter(List<Person> persons, Context context) {
this.persons = persons;
this.context = context;
}

@Override
public int getCount() {
return this.persons.size();
}

@Override
public Object getItem(int position) {
return this.persons.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

Holder holder = null;

if( convertView == null ){
convertView = new LinearLayout(context);
((LinearLayout) convertView).setOrientation(LinearLayout.VERTICAL);

TextView tvId = new TextView(context);
tvId.setPadding(10, 10, 10, 10);
tvId.setTextColor(Color.parseColor("#FF0000"));

TextView tvName = new TextView(context);
tvName.setPadding(10, 10, 10, 10);
tvName.setTextColor(Color.parseColor("#2478FF"));

// TextView tvAge = new TextView(context);
// tvAge.setPadding(10, 10, 10, 10);
// tvAge.setTextColor(Color.parseColor("#2478FF"));
//
// TextView tvPhone = new TextView(context);
// tvPhone.setPadding(10, 10, 10, 10);
// tvPhone.setTextColor(Color.parseColor("#2478FF"));
//
// TextView tvAddress = new TextView(context);
// tvAddress.setPadding(10, 10, 10, 10);
// tvAddress.setTextColor(Color.parseColor("#2478FF"));


((LinearLayout) convertView).addView(tvId);
((LinearLayout) convertView).addView(tvName);
// ((LinearLayout) convertView).addView(tvAge);
// ((LinearLayout) convertView).addView(tvPhone);
// ((LinearLayout) convertView).addView(tvAddress);

holder = new Holder();
holder.tvId = tvId;
holder.tvName = tvName;
// holder.tvAge = tvAge;
// holder.tvPhone = tvPhone;
// holder.tvAddress = tvAddress;

convertView.setTag(holder);

}
else{
holder = (Holder) convertView.getTag();
}
final Person person = (Person) getItem(position);
holder.tvId.setText(" ID: " + person.get_id() + "");
holder.tvName.setText(" NAME : " + person.getName() );
// holder.tvAge.setText(" AGE : " + person.getAge() );
// holder.tvPhone.setText(" PHONE : " + person.getPhone());
// if ( person.getAddress() == null) {
// holder.tvAddress.setText(" ADDRESS : == NO DATA ==");
// }
// else {
// holder.tvAddress.setText(" ADDRESS : " + person.getAddress());
// }

convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), DetailActivity.class);
intent.putExtra("person", person.get_id()+"");

startActivity(intent);
}
});
return convertView;
}
}

private class Holder {

public TextView tvId;
public TextView tvName;
/* public TextView tvAge;
public TextView tvPhone;
public TextView tvAddress;*/

}
}



예제 결과 화면

testDB 라는 이름의 table을 생성한다.


InsertData 버튼을 눌러 data를 입력한다.


성공적으로 insert가 되어 SelectData를 누르면 입력한 정보가 나타난다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함