Android

Android DB SQLite 예제

Ohjeonghak 2014. 2. 13. 01:54
반응형

먼저 포스팅 출처를 먼저 밝힌다.

정리를 너무 잘 해 두셨기에 긁어왔다. 수정은 거의 하지 않고 주석으로 설명을 약간 더 추가해서 포스팅 했다.

 http://blog.naver.com/tinatan?Redirect=Log&logNo=70176627062

 

 

 

Android 상에서 SQLite 예제를 제작해봅시다.

첫 번째 예제는 Layout에 결과물을 찍는 형태가 아닌 콘솔(Logcat)에 결과를 출력하는 형태로 진행하겠습니다.

데이터를 어떻게 주고 받는지가 주 포인트라고 할 수 있습니다.  

 

 

Layout xml 파일은 생성 시 상태 그대로 입니다.

 

 

MainActivity.java

 

package com.example.test52sqlite;

 

import android.os.Bundle;

import android.util.Log;

import android.app.Activity;

import android.content.ContentValues;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

 

public class MainActivity extends Activity {

 

    SQLiteDatabase db;

    MySQLiteOpenHelper helper;

    // 전역변수로 사용할 것들을 미리 빼두었다.

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        helper = new MySQLiteOpenHelper(MainActivity.this, // 현재 화면의 context

                "person.db", // 파일명

                null, // 커서 팩토리

                1); // 버전 번호

 

        // 1. 데이터 저장

        insert("유저1", 18, "경기도");

        insert("유저2", 28, "각기도");

        insert("유저3", 28, "각도기");

 

        // 2. 수정하기

        update("유저1", 58); // 나이만 수정하기

        

        // 3. 삭제하기

        delete("유저2");

        

        // 4. 조회하기

        select();

    }

 

    // insert

    public void insert(String name, int age, String address) {

        db = helper.getWritableDatabase(); // db 객체를 얻어온다. 쓰기 가능

 

        ContentValues values = new ContentValues();

        // db.insert의 매개변수인 values가 ContentValues 변수이므로 그에 맞춤

        // 데이터의 삽입은 put을 이용한다.

        values.put("name", name);

        values.put("age", age);

        values.put("address", address);

        db.insert("student", null, values); // 테이블/널컬럼핵/데이터(널컬럼핵=디폴트)

        // tip : 마우스를 db.insert에 올려보면 매개변수가 어떤 것이 와야 하는지 알 수 있다.

    }

 

    // update

    public void update (String name, int age) {

        db = helper.getWritableDatabase(); //db 객체를 얻어온다. 쓰기가능

        

        ContentValues values = new ContentValues();

        values.put("age", age);    //age 값을 수정

        db.update("student", values, "name=?", new String[]{name});

        /*

         * new String[] {name} 이런 간략화 형태가 자바에서 가능하다

         * 당연하지만, 별도로 String[] asdf = {name} 후 사용하는 것도 동일한 결과가 나온다.

         */

        

        /*

         * public int update (String table,

         * ContentValues values, String whereClause, String[] whereArgs)

         */

    }

    

    // delete

    public void delete (String name) {

        db = helper.getWritableDatabase();

        db.delete("student", "name=?", new String[]{name});

        Log.i("db", name + "정상적으로 삭제 되었습니다.");

    }

    

    // select

    public void select() {

 

        // 1) db의 데이터를 읽어와서, 2) 결과 저장, 3)해당 데이터를 꺼내 사용

 

        db = helper.getReadableDatabase(); // db객체를 얻어온다. 읽기 전용

        Cursor c = db.query("student", null, null, null, null, null, null);

 

        /*

         * 위 결과는 select * from student 가 된다. Cursor는 DB결과를 저장한다. public Cursor

         * query (String table, String[] columns, String selection, String[]

         * selectionArgs, String groupBy, String having, String orderBy)

         */

 

        while (c.moveToNext()) {

            // c의 int가져와라 ( c의 컬럼 중 id) 인 것의 형태이다.

            int _id = c.getInt(c.getColumnIndex("_id"));

            String name = c.getString(c.getColumnIndex("name"));

            int age = c.getInt(c.getColumnIndex("age"));

            String address = c.getString(c.getColumnIndex("address"));

            Log.i("db", "id: " + _id + ", name : " + name + ", age : " + age

                    + ", address : " + address);

        }

    }

}

 

 

 

 

MySQLiteOpenHelper.java

 

package com.example.test52sqlite;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;

 

/*

* sql을 사용하기 위한 제반 클래스

* SQLiteOpenHelper는 사용에 도움을 주는 클래스이다.

* 데이터베이스를 생성하거나 업그레이드 하는기능 또는, 오픈하려면 SQLiteOpenHelper 객체를 사용한다.

* SQLiteOpenHelper 클래스를 상속받아 구현하려면

*

*     1) 생성 메소드 : 상위 클래스의 생성 메소드를 호출, Activity 등의 Context 인스턴스와

*                          데이터베이스의 이름, 커서 팩토리(보통 Null 지정) 등을 지정하고,

*                          데이터베이스 스키마 버전을 알려주는 숫자값을 넘겨 준다.

*     2) onCreate() 메소드 : SQLiteDatabase를 넘겨 받으며, 데이블을 생성하고 초기 데이터를

*                                  추가하기에 적당한 위치이다.

*     3) onUpgrade() 메소드 : SQLiteDatabase 인스턴스를 넘겨 받으며, 현재 스키마 버전과

*                                     최신 스키마 버전 번호도 받는다.

*

* 위의 세가지 기능을 사용해야한다.

*/

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

 

    public MySQLiteOpenHelper(Context context, String name,

            CursorFactory factory, int version) {

        super(context, name, factory, version);

        // TODO Auto-generated constructor stub

 

    }

 

    @Override

    public void onCreate(SQLiteDatabase db) {

        // TODO Auto-generated method stub 

 

  // SQL 쿼리문은 다음과 같은 형태로도 실행 할 수도 있다. 

 

        // SQLiteOpenHelper 가 최초 실행 되었을 때

        String sql = "create table student (" +

                "_id integer primary key autoincrement, " +

                "name text, " +

                "age integer, " +

                "address text);";

 

        db.execSQL(sql);

    }

 

    @Override

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        // db = 적용할 db, old/new 구 버전/신버전

        // TODO Auto-generated method stub

        /*

         * db 버전이 업그레이드 되었을 때 실행되는 메소드

         * 이 부분은 사용에 조심해야 하는 일이 많이 있다. 버전이 1인 사용자가 2로 바뀌면

         * 한번의 수정만 하면 되지만 버전이 3으로 되면 1인 사용자가 2, 3을 거쳐야 하고

         * 2인 사용자는 3 까지만 거치면 된다. 이렇게 증가할 수록 수정할 일이 많아지므로

         * 적절히 사용해야 하며 가능하면 최초 설계 시에 완벽을 기하는 것이 가장 좋을 것이다.

         * 테스트에서는 기존의 데이터를 모두 지우고 다시 만드는 형태로 하겠다.

         */

        

        String sql = "drop table if exists student";

        db.execSQL(sql);

        

        onCreate(db); // 테이블을 지웠으므로 다시 테이블을 만들어주는 과정

    }

}  

 

 

실행 결과 (여러 번 실행해서 사용자가 여러 개 들어가있는 상태임)

(실행 결과는 Logcat 에서 확인할 수 있는 내용이다.)

 

10-01 00:44:42.801: I/db(585): 유저2정상적으로 삭제 되었습니다.

10-01 00:44:42.801: I/db(585): id: 1, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.810: I/db(585): id: 2, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.810: I/db(585): id: 3, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.810: I/db(585): id: 5, name : 유저3, age : 28, address : 할기디

10-01 00:44:42.810: I/db(585): id: 6, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.810: I/db(585): id: 8, name : 유저3, age : 28, address : 할기디

10-01 00:44:42.810: I/db(585): id: 9, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.810: I/db(585): id: 11, name : 유저3, age : 28, address : 할기디

10-01 00:44:42.820: I/db(585): id: 12, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.820: I/db(585): id: 14, name : 유저3, age : 28, address : 할기디

10-01 00:44:42.820: I/db(585): id: 15, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.831: I/db(585): id: 17, name : 유저3, age : 28, address : 각도기

10-01 00:44:42.831: I/db(585): id: 18, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.841: I/db(585): id: 20, name : 유저3, age : 28, address : 각도기

10-01 00:44:42.841: I/db(585): id: 21, name : 유저1, age : 58, address : 경기도

10-01 00:44:42.841: I/db(585): id: 23, name : 유저3, age : 28, address : 각도기

 

 

 웹 프로그래밍, DB 초급을 진행해보신 사용자라면 흐름에 대해 큰 부담 없이 이해하셨을 수 있을 것입니다. 웹을 해보지 않으셨더라도

정리: SQLite DB를 사용하기 위해 SQLiteOpenHelper를 상속받은 클래스에서 생성자를 통해 DB를 연결하고 onCreate를 통해 DB가 없을 경우 생성, 버전은 onUpgrade를 통해 관리하나 최초 설계시 똑바로 해서 변경할 일이 없도록 하는 것이 좋다.

반응형