데이터베이스의 레코드를 검색하는 방법을 알아본다.

검색 메서드는 다른 SQL문과는 달리 결과셋을 리턴해야 하므로 execSQL 메서드가 아닌 rawQuery 메서드를 실행해야 한다고 한다.

		int index = 0;
		cursor = mDB.rawQuery("SELECT item, price FROM shop", null);
		while(cursor.moveToNext()) {
			arrShop[index][0] = cursor.getInt(0);
			arrShop[index][1] = cursor.getInt(1);
	        index ++;
		}

shop 이라는 테이블안에 item, price 라는 레코드가 들어있음.
cursor 를 moveToNext();로 하나씩 레코드를 검색한다. 만약 더이상 레코드가 없으면 while문을 빠져나오게 된다.
레코드의 순서를 미리 알고있다면 cursor.getInt(순서); 식으로 불러오면된다.

shop 테이블 안에 레코드의 순서는 item, price 순서대로 만들어 놓았으므로 각각 0번과 1번을 갖게된다.



'Android > Databases' 카테고리의 다른 글

데이터베이스 Transaction 사용하기  (0) 2011.07.26
데이터베이스 검색  (0) 2011.07.13
데이터베이스 삭제 및 갱신  (2) 2011.07.03
데이터베이스 업그레이드하기  (0) 2011.07.03
데이터베이스 사용하기  (1) 2011.07.02



앞서 데이터베이스의 간단한 사용방법과 데이터의 추가, 업그레이드 방법을 알아보았다.
이번에는 데이터 삭제 및 갱신하는 방법에 대하여 알아본다.
기존에 테스트하던 앱을 제거 후 새로운코드로 재설치 하였다.

DB_Test.java
package pe.berabue.dbtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class DB_Test extends Activity {
	
	private DBManager mDBManager;
	
	/** Called when the activity is first created. */
	@Override
 	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		findViewById(R.id.btn_insert).setOnClickListener(mClickListener);
		findViewById(R.id.btn_delete).setOnClickListener(mClickListener);
		findViewById(R.id.btn_update).setOnClickListener(mClickListener);
		findViewById(R.id.btn_select).setOnClickListener(mClickListener);
		
		mDBManager = new DBManager(this);
		mDBManager.getReadableDatabase();
	//	mDBManager.getWritableDatabase();
		mDBManager.close();
    }
	
	Button.OnClickListener mClickListener = new View.OnClickListener() {
		public void onClick(View v) {
			switch(v.getId()) {			
			case R.id.btn_insert:	mDBManager.insert(mDBManager);	break;
			case R.id.btn_delete:	mDBManager.delete(mDBManager);	break;
			case R.id.btn_update:	mDBManager.update(mDBManager);	break;
			case R.id.btn_select:	mDBManager.select(mDBManager);	break;
			}
		}
	};
}
액티비티에 4개의 버튼을 구현해 놓고 각기 다른 기능을 넣어두었다.
4번째 버튼인 select버튼은 미구현.


DBManager.java
package pe.berabue.dbtest;

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

public class DBManager extends SQLiteOpenHelper {

	public static final String	DB_NAME		= "dbtest.db";
	public static final int		DB_VERSION	= 1;
	
	private SQLiteDatabase mDB;
	private String str;
	private int temp;
	
	public DBManager(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
		
		str = "str_";
		temp = 0;
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE Android( _id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT, price INTEGER);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Cupcake'			, 500		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Donut'			, 1000		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Eclair'			, 1500		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Froyo'			, 10000		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Ginger bread'	, 100000	);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Honeycomb'		, 999999	);");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("INSERT INTO Android VALUES (null, 'Icecream Sandwich'	, 1	);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Jellybean'			, 2	);");
	}
	
	@Override
	public void onOpen(SQLiteDatabase db) {
		super.onOpen(db);
		mDB = db;
	}

	public void insert(DBManager mDBManager) {
		mDBManager.getWritableDatabase();
		mDB.execSQL("INSERT INTO Android VALUES (null, '"+ str +"', "+ temp +" );");
		mDBManager.close();
		
		str += temp;
		temp++;
		Log.v(null,"Insert DB : "+temp);
	}
	
	public void delete(DBManager mDBManager) {
		mDBManager.getWritableDatabase();
		mDB.execSQL("DELETE FROM Android WHERE price = "+ (temp-1) +";");
		mDBManager.close();
		
		temp--;
		Log.v(null,"Delete DB : "+temp);
	}
	
	public void update(DBManager mDBManager) {
		mDBManager.getWritableDatabase();
		mDB.execSQL("UPDATE Android SET price = "+ (temp+10) +" WHERE price = "+ (temp-1) +";");
		mDBManager.close();

		Log.v(null,"Update DB : "+temp);
	}
	
	public void select(DBManager mDBManager) {

	}
}
open();
 DB를 열때 mDB에 객체를 저장시켜 놓는다.
insert();
 DB를 읽기/쓰기 용으로 열고 name과 price를 입력시켜 테이블에 추가한다.
delete();
 DB를 읽기/쓰기 용으로 열고 Android 테이블에 price가 temp-1인 데이터를 찾아 삭제시킨다.
update(); 
 DB를 읽기/쓰기 용으로 열고 Android 테이블에 price가 temp-1인 데이터를 찾아 price를 temp+10값으로 변경시킨다. 


main.xml


    



'Android > Databases' 카테고리의 다른 글

데이터베이스 Transaction 사용하기  (0) 2011.07.26
데이터베이스 검색  (0) 2011.07.13
데이터베이스 삭제 및 갱신  (2) 2011.07.03
데이터베이스 업그레이드하기  (0) 2011.07.03
데이터베이스 사용하기  (1) 2011.07.02
  1. 프로그래머123 2012.01.30 02:21

    좋은자료감사합니다~

  2. 히창아 2019.03.13 10:23

    감사합니다!



데이터를 넣어 앱을 배포하였는데 다음버전에서 데이터가 추가되거나 삭제되어야 한다면?
데이터베이스 버전을 바꾸고 재배포 하면된다.


package pe.berabue.dbtest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBManager extends SQLiteOpenHelper {

	public static final String	DB_NAME		= "dbtest.db";
	public static final int		DB_VERSION	= 2;
	
	
	public DBManager(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE Android( _id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT, price INTEGER);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Cupcake'			, 500		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Donut'			, 1000		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Eclair'			, 1500		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Froyo'			, 10000		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Ginger bread'	, 100000	);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Honeycomb'		, 999999	);");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("INSERT INTO Android VALUES (null, 'Icecream Sandwich'	, 1	);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Jellybean'			, 2	);");
	}
}
만약 기존의 DB배포 버전이 1이였다면, 재배포 하는 DB의 버전을 2로 올려준다.
그러면 DB의 버전이 바뀌었으므로 DB가 실행될때 자동으로 onUpgrade(); 메서드를 호출한다.
 


2011/07/02 - [Android/Databases] - 데이터베이스 사용하기
 
위 소스에 onUpgrade(); 부분과 DB버전만 변형시켜서 실행해보았다.
7,8번 데이터가 추가된 것을 확인 할 수 있다. 



'Android > Databases' 카테고리의 다른 글

데이터베이스 Transaction 사용하기  (0) 2011.07.26
데이터베이스 검색  (0) 2011.07.13
데이터베이스 삭제 및 갱신  (2) 2011.07.03
데이터베이스 업그레이드하기  (0) 2011.07.03
데이터베이스 사용하기  (1) 2011.07.02



프로젝트를 진행하다보면 데이터를 저장해야 할 때가 있다.
데이터를 저장하는 방법은 프레프런스, 파일, DB 등이 있다.

SQLite는 다른 데이터베이스에 비해 사용 가능한 자료형이 많지않고 5가지를 지원한다.
NULL
INTEGER : 1,2,3,4,6,8bytes의 정수값
REAL : 8bytes의 부동소수점값
TEXT : UTF-8, UTF-16BE, UTE-16LE 인코딩의 문자열
BLOB : 입력된 그대로 저장

SELECT 명령을 제외한 대부분의 명령을 execSQL(String sql); 메서드로 실행 할 수 있다. execSQL("CREATE TABLE 테이블명( _id INTEGER PRIMARY KEY AUTOINCREMENT,변수 자료형);");
 _id 필드는 자동으로 값이 증가한다. 변수+자료형 필드는 콤마(,)를 사용해 여러개를 지정 할 수 있다.
execSQL("INSERT INTO 테이블명 VALUES (데이터);");
 레코드 추가
execSQL("DELETE FROM 테이블명 WHERE 조건;");
 레코드 삭제, WHERE문을 적지 않으면 테이블 삭제
execSQL("UPDATE 테이블명 SET 갱신내용 WHERE 조건;");
 레코드 업데이트
 

DB_Test.java
package pe.berabue.dbtest;

import android.app.Activity;
import android.os.Bundle;

public class DB_Test extends Activity {
	
	private DBManager mDBManager;
//	private SQLiteDatabase mDB;
	
	/** Called when the activity is first created. */
	@Override
 	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
        
		mDBManager = new DBManager(this);
		mDBManager.getReadableDatabase();
	//	mDBManager.getWritableDatabase();
		mDBManager.close();
    }
}
기능이 있는 화면은 아니다.
mDBManager.getReadableDatabase();  읽기전용으로 DB를 불러온다. 이 때 생성된 DB가 없으면 onCreate(); DB가 있지만 버전이 바뀌었다면 onUpgrade();를 호출한다.
mDBManager.getWritableDatabase();  읽고/쓰기가 가능하다. getReadableDatabase();과 마찬가지로 onCreate(); onUpgrade();를 호출. mDBManager.close();
 위 두 구문을 실행 한 뒤에 호출하여 DB를 닫아준다.


DBManager.java
package pe.berabue.dbtest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBManager extends SQLiteOpenHelper {

	public static final String	DB_NAME		= "dbtest.db";
	public static final int		DB_VERSION	= 1;
	
	
	public DBManager(Context context) {
		super(context, DB_NAME, null, DB_VERSION);
	}
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE Android( _id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT, price INTEGER);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Cupcake'			, 500		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Donut'			, 1000		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Eclair'			, 1500		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Froyo'			, 10000		);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Ginger bread'	, 100000	);");
		db.execSQL("INSERT INTO Android VALUES (null, 'Honeycomb'		, 999999	);");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
	}

}
생성할 DB의 이름과 버전을 상수로 정의해 놓았다.
생성자에서 DB이름과 버전을 정의해 놓고 DB가 사용될때 버전이 더 높다면 onUpgrade();를 통해 내용을 수정시킬 수 있다.
db.execSQL("INSERT INTO 테이블명 VALUES (데이터);");
 데이터를 삽입할때 사용하는 쿼리문.
Android 라는 테이블 하나를 생성하고 Android 테이블에 안드로이드 코드명 C ~ H의 코드네임과 멋대로 가격을 입력시켜 놓았다.
실제 단말기에서 DB를 열어보려면 루팅을 해야 하고, 에뮬레이터로 실행시키면 DDMS를 통해 DB파일이 생성되었는지 확인이 가능하다.

명령프롬프트 창을 이용해 DB를 들여다보자.



데이터베이스는 data/data/패키지명/databases 경로에 저장되어있다.
해당경로로 이동을 하고 'sqlite3 DB명'을 사용해 저장된 DB를 실행시키면 버전과 도움말을 보는 방법을 알려준다.
해당DB의 테이블을 보고싶다면 .tables를 입력한다.
위에서 생성한 Android라는 테이블과 기본적인 android_metadata라는 테이블이 존재한다.
테이블안에 들어있는 데이터를 보려면 select * from 테이블명; 을 입력한다.

입력한 그대로 1번부터 6번까지의 데이터가 출력된다.
 




'Android > Databases' 카테고리의 다른 글

데이터베이스 Transaction 사용하기  (0) 2011.07.26
데이터베이스 검색  (0) 2011.07.13
데이터베이스 삭제 및 갱신  (2) 2011.07.03
데이터베이스 업그레이드하기  (0) 2011.07.03
데이터베이스 사용하기  (1) 2011.07.02
  1. 예쁜꽃이피었으면 2015.04.23 17:53 신고

    담아갈게요~

+ Recent posts