본문 바로가기
개발 공부 기록하기/- Android

[안드로이드] SQLite 사용하기

by soulduse 2016. 3. 4.
반응형

출처 : http://here4you.tistory.com/49

안드로이드 개인 앱개발을 진행하면서, 파싱한 데이터를 SQLite에 저장할 필요가 생기게 되었는데

해당 내용을 참조하여 데이터가 잘 들어간 것을 확인하였다.


생각보다 쉽네~~


public class SQLiteHelper extends SQLiteOpenHelper {

public static SQLiteHelper sqLiteHelper = null;
public static final String DATABASE_NAME = "NumberData.db";
public static final String TABLE_NAME = "Lotto_table";
public static final int DB_VERSION = 1;
public static final String IDX = "IDX";
public static final String COL_0 = "DRWNO";
public static final String COL_1 = "DRWTNO1";
public static final String COL_2 = "DRWTNO2";
public static final String COL_3 = "DRWTNO3";
public static final String COL_4 = "DRWTNO4";
public static final String COL_5 = "DRWTNO5";
public static final String COL_6 = "DRWTNO6";
public static final String COL_7 = "BNUSNO";
public static final String COL_8 = "FIRSTPRZWNERCO";
public static final String COL_9 = "FIRSTWINAMNT";
public static final String COL_10 = "TOTSELLAMNT";
public static final String COL_11 = "DRWNODATE";

private SQLiteDatabase db;

public static SQLiteHelper getInstance(Context context){ // 싱글턴 패턴으로 구현하였다.
if(sqLiteHelper == null){
sqLiteHelper = new SQLiteHelper(context);
}

return sqLiteHelper;
}

private SQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DB_VERSION);
db = this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME + " ("
+ IDX + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_0 + " INTEGER, "
+ COL_1 + " INTEGER, "
+ COL_2 + " INTEGER, "
+ COL_3 + " INTEGER, "
+ COL_4 + " INTEGER, "
+ COL_5 + " INTEGER, "
+ COL_6 + " INTEGER, "
+ COL_7 + " INTEGER, "
+ COL_8 + " INTEGER, "
+ COL_9 + " INTEGER, "
+ COL_10 + " INTEGER, "
+ COL_11 + " TEXT"
+ ")");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);    
onCreate(db);
}

// 데이터 주입
public boolean insertData(NumberData numberData){ // Insert 하는 부분
// SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_0, numberData.getDrwNo());
contentValues.put(COL_1, numberData.getDrwtNo1());
contentValues.put(COL_2, numberData.getDrwtNo2());
contentValues.put(COL_3, numberData.getDrwtNo3());
contentValues.put(COL_4, numberData.getDrwtNo4());
contentValues.put(COL_5, numberData.getDrwtNo5());
contentValues.put(COL_6, numberData.getDrwtNo6());
contentValues.put(COL_7, numberData.getBnusNo());
contentValues.put(COL_8, numberData.getFirstPrzwnerCo());
contentValues.put(COL_9, numberData.getFirstWinamnt());
contentValues.put(COL_10, numberData.getTotSellamnt());
contentValues.put(COL_11, numberData.getDrwNoDate());
long result = db.insert(TABLE_NAME, null, contentValues);
if(result == -1)
return false;
else
return true;
}

// 데이터의 존재 유무 확인
public boolean isSelectData(int drwno){    
boolean isData = false;
String sql = "select * from "+TABLE_NAME+" where "+COL_0+" = "+drwno+";";
Cursor result = db.rawQuery(sql, null);

// result(Cursor)객체가 비어있으면 false 리턴
if(result.moveToFirst()){
isData = true;
}
result.close();
return isData;
}

// 원하는 회차 조회
public NumberData selectData(int drwno){
NumberData lottoData = null;
String sql = "select * from "+TABLE_NAME+" where "+COL_0+" = "+drwno+";";
Cursor result = db.rawQuery(sql, null);

// result(Cursor)객체가 비어있으면 false 리턴
if(result.moveToFirst()){
lottoData = new NumberData();
lottoData.setDrwNo(result.getInt(1));
lottoData.setDrwtNo1(result.getInt(2));
lottoData.setDrwtNo2(result.getInt(3));
lottoData.setDrwtNo3(result.getInt(4));
lottoData.setDrwtNo4(result.getInt(5));
lottoData.setDrwtNo5(result.getInt(6));
lottoData.setDrwtNo6(result.getInt(7));
lottoData.setBnusNo(result.getInt(8));
lottoData.setFirstPrzwnerCo(result.getInt(9));
lottoData.setFirstWinamnt(result.getLong(10));
lottoData.setTotSellamnt(result.getLong(11));
lottoData.setDrwNoDate(result.getString(12));
result.close();
return lottoData;
}
result.close();
return lottoData;
}

// 전체 데이터 조회
public List<NumberData> selectAll(){
List<NumberData> dataResultList = new ArrayList<NumberData>();
String sql = "select * from "+TABLE_NAME+" ORDER BY "+COL_0+" DESC;";
Cursor results = db.rawQuery(sql, null);

if(results.moveToFirst()){
do{
NumberData lottoData = new NumberData();
lottoData.setDrwNo(results.getInt(1));
lottoData.setDrwtNo1(results.getInt(2));
lottoData.setDrwtNo2(results.getInt(3));
lottoData.setDrwtNo3(results.getInt(4));
lottoData.setDrwtNo4(results.getInt(5));
lottoData.setDrwtNo5(results.getInt(6));
lottoData.setDrwtNo6(results.getInt(7));
lottoData.setBnusNo(results.getInt(8));
lottoData.setFirstPrzwnerCo(results.getInt(9));
lottoData.setFirstWinamnt(results.getLong(10));
lottoData.setTotSellamnt(results.getLong(11));
lottoData.setDrwNoDate(results.getString(12));
dataResultList.add(lottoData);
}while(results.moveToNext());
}
return dataResultList;
}

// 가장 최신 회차 번호 가져오기.
public int getMaxDrwNo(){
String []columns = new String[]{COL_0};
int maxDrwNo = 0;
Cursor result = db.query(TABLE_NAME, columns, null, null, null, null, COL_0 + " DESC", "1");
if(result.moveToFirst()){
maxDrwNo = result.getInt(0);
result.close();
return maxDrwNo;
}
result.close();
return maxDrwNo;
}

// DELETE
public int deleteRecord(){
int deleteRecordCnt = db.delete(TABLE_NAME, null, null);

return deleteRecordCnt;
}
}


해당 메서드를 구성하고 다른 액티비티에서 Insert, delete, select가 가능하다 Update의 경우는 구현하고자 하는 내용에 필요가 없어서

제외하였다.





아래는 참고한 사이트의 내용이다

아래의 내용은 싱글톤 패턴으로 구현되어 있지 않다.

그리고 close도 주기적으로 해주는 모습을 보인다.


하지만 싱글톤 패턴으로 구현 되어있다면, SQLite객체를 단 한번만 생성하고 단 한번만 열어서 사용하기 때문에 굳이 DB를 닫지 않더라도,

메모리 누수가 발생하지 않는다. 만일 DB를 사용할때마다 DB를 열도록 구현했다면 메모리 누수가 발생하지 않도록 사용후 닫아 줘야 한다.



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package com.example.databasetest;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
 
public class MainActivity extends Activity {
 
    // 상수 관련
    String dbName = "apList.db"; // name of Database;
    String tableName = "apListTable"; // name of Table;
    int dbMode = Context.MODE_PRIVATE;
     
    // Database 관련 객체들
    SQLiteDatabase db;
     
    // GUI 관련
    public Button btCreateDB, btCreateTable, btRemoveTable, btInsertData,
            btRemoveData;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btCreateDB = (Button) findViewById(R.id.btCreatDB);
        btCreateTable = (Button) findViewById(R.id.btCreateTable);
        btRemoveTable = (Button) findViewById(R.id.btRemoveTable);
        btInsertData = (Button) findViewById(R.id.btInsertData);
        btRemoveData = (Button) findViewById(R.id.btRemoveData);
        db = openOrCreateDatabase(dbName,dbMode,null);
    }
 
    public void onClick(View v) {
        int id = v.getId();
        if (id == btCreateDB.getId()) {
            //createDatabase(dbName,dbMode);
        } else if (id == btCreateTable.getId()) {
            createTable();
        } else if (id == btRemoveTable.getId()) {
            removeTable();
        } else if (id == btInsertData.getId()) {
            insertData("hahahehe");
        } else if (id == btRemoveData.getId()) {
            selectAll();
        }
    }
     
    // Database 생성 및 열기
    public void createDatabase(String dbName, int dbMode){
        db = openOrCreateDatabase(dbName,dbMode,null);
    }
     
    // Table 생성
    public void createTable(){
        String sql = "create table " + tableName + "(id integer primary key autoincrement, "+"voca text not null)";
        db.execSQL(sql);
    }
     
    // Table 삭제
    public void removeTable(){
        String sql = "drop table " + tableName;
        db.execSQL(sql);
    }
     
    // Data 추가
    public void insertData(String voca){
        String sql = "insert into " + tableName + " values(NULL, '" + voca +"');";
        db.execSQL(sql);
    }
     
    // Data 업데이트
    public void updateData(int index, String voca){
        String sql = "update " + tableName + " set voca = '" + voca +"' where id = "+index +";";
        db.execSQL(sql);
    }
     
    // Data 삭제
    public void removeData(int index){
        String sql = "delete from " + tableName + " where id = "+index+";";
        db.execSQL(sql);
    }
     
    // Data 읽기(꺼내오기)
    public void selectData(int index){
        String sql = "select * from " +tableName+ " where id = "+index+";";
        Cursor result = db.rawQuery(sql, null);
         
        // result(Cursor 객체)가 비어 있으면 false 리턴
        if(result.moveToFirst()){
            int id = result.getInt(0);
            String voca = result.getString(1);
            Toast.makeText(this, "index= "+id+" voca="+voca, 0).show();
        }
        result.close();
    }
     
     
    // 모든 Data 읽기
    public void selectAll(){
        String sql = "select * from " + tableName + ";";
        Cursor results = db.rawQuery(sql, null);
         
        results.moveToFirst();
         
        while(!results.isAfterLast()){
            int id = results.getInt(0);
            String voca = results.getString(1);
            Toast.makeText(this, "index= "+id+" voca="+voca, 0).show();
            results.moveToNext();
        }
        results.close();
    }
     
     
}







반응형