본문 바로가기

프로그래밍/Android 짜투리 지식

[안드로이드] SQLite를 이용한 database 생성



시도]
안드로이드 어플리케이션에서 데이터베이스를 이용하고싶다.

생각]
외부 DB파일을 읽어와서 사용하고싶다.
데이터베이스를 작성하는 어플리케이션을 만들수도 있다!?
 - SQLite라는 놈이 있다. 이놈을 이용하여 데이터베이스를 작성할 수 있다.
 - 얼마의 기능이 있는지는 학습하지 못하였다.
 - SQLite로 데이터베이스의 생성, 삭제, 테이블의 생성, 삭제, 속성의 삽입,삭제,갱신이 가능하다.
외부 DB파일을 읽어올 수 있는 SQLite 구문이 있다.
SQLiteDatabase.openDatabase

일단 데이터베이스를 생성하는 어플리케이션을 만들어 보자.

구현]

데이터베이스 생성부분
SQLiteDatabase db;	
	public final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; 	
	public final int FP = ViewGroup.LayoutParams.FILL_PARENT;	
	private int numofVoca = 0; // id(기본키)	
	public int DB_MODE = Context.MODE_PRIVATE;		
	public String DB_NAME = "voca.db"; // DB 생성시 이름	
	public String TABLE_NAME = "vocaTable"; // Table의 이름	
	public Button db_create, table_create, del_table, data_insert, data_update; // Button	
	public EditText EdT_voca, EdT_Id, EdT_updateId, EdT_updateVoca; // EditText

 
	db_create = (Button)findViewById(R.id.Button01); // XML로 작성한 버튼 연결        
	db_create.setText("Database 작성");         
	db_create.setOnClickListener(new OnClickListener() {						
		@Override			
		public void onClick(View v) {				
			// TODO Auto-generated method stub				
			db = openOrCreateDatabase(DB_NAME, DB_MODE, null); // 있으면 열고, 없으면 생성				
			Log.i("database test", DB_NAME + " Database create"); // Log cat에 뿌릴 내용			
			}		
		});       

성공적으로 생성이 되었다면 Logcat에 보면 DB의 이름과 함께 Database create라는 내용이 적힐 것이다.


테이블 생성부분
		table_create = (Button)findViewById(R.id.Button02);        
		table_create.setText("Table 만들기");        
		table_create.setOnClickListener(new OnClickListener() {						
			@Override			
			public void onClick(View v) {				
				// TODO Auto-generated method stub				
				String sql = "create table " + TABLE_NAME + 
						"(id integer primary key autoincrement, " + 
						"voca text not null)";
				try{					
					db.execSQL(sql);					
					Log.i("databasetest", TABLE_NAME + "Table create");				
					}catch(SQLException e){									
						
					}			
				}		
			});

여기서 보면 이제부터 SQL문이 작성되는것을 볼 수 있다.
테이블을 만드는 버튼을 클릭하면 sql(String) 에는 table을 생성하는 sql문을 적어준다.
create table table이름 (이름 이름타입 키타입 속성,  이름 이름타입 [키타입] 속성) 을 적어준다.

id에서 primary key라하여 기본키로 설정하고 autoincrement는 자동증가값이라는것이다.
(자동증가값은 아직 학습하지 않아 언급하지 않겠다;;)

결론은 그냥 SQL문을 적어서 실행시키면된다.
db.execSQL(sql) 로 실행하였다.

테이블 삭제 부분
        
	del_table = (Button)findViewById(R.id.Button03);        
	del_table.setText("Table 삭제");        
	del_table.setOnClickListener(new OnClickListener() {						
		@Override			
		public void onClick(View v) {				
			// TODO Auto-generated method stub				
			String sql = "drop table " + TABLE_NAME;				
			try{					
				db.execSQL(sql);					
				Log.i("database test", "Table delete");				
				}catch(SQLException e){									
					
				}			
			}		
		});

위와 같다. String에 SQL문을 적어서 그걸 실행시켜주면된다.
drop table table이름

값 삽입 부분

	data_insert = (Button)findViewById(R.id.Button04);        
	data_insert.setOnClickListener(new OnClickListener() {						
		@Override			
		public void onClick(View v) {				
			// TODO Auto-generated method stub				
			numofVoca = numofVoca +1;				
			String voca = EdT_voca.getText().toString();				
			String sql = "insert into " + TABLE_NAME + " " +
					"(id, voca) values( '" + numofVoca +								
					"', '" + voca +"' );";				
			try{					
				db.execSQL(sql);					
				Log.i("database test", " Data Value Insert");				
				}catch(SQLException e){									
					
				}			
			}		
		});

이제 슬슬 감이 올것이다. 그냥 SQL구문을 저장한 문자열로 SQL을 실행하면된다.
삽입하는 구문은 다음과 같은 insert 이며 속성값을 적어서 넣어주면된다.
어떤속성? 이라는 의문을 가진다면 DB를 따로 학습해야 할것이다.

# 학습 코드 전문
	package sun.db;
	import android.app.Activity;
	import android.content.Context;
	import android.database.SQLException;
	import android.database.sqlite.SQLiteDatabase;
	import android.graphics.LinearGradient;
	import android.os.Bundle;
	import android.util.Log;
	import android.view.View;
	import android.view.View.OnClickListener;
	import android.view.ViewGroup;
	import android.widget.Button;
	import android.widget.EditText;
	import android.widget.LinearLayout;
	public class submit_DB extends Activity {	
		SQLiteDatabase db;	
		public final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;	
		public final int FP = ViewGroup.LayoutParams.FILL_PARENT;	
		private int numofVoca = 0;	
		public int DB_MODE = Context.MODE_PRIVATE;		
		public String DB_NAME = "voca.db";	
		public String TABLE_NAME = "vocaTable";	
		public Button db_create, table_create, del_table, data_insert, data_update;	
		public EditText EdT_voca, EdT_Id, EdT_updateId, EdT_updateVoca;    
		private	LinearLayout.LayoutParams createParam(int w, int h){    	
			return new LinearLayout.LayoutParams(w,h);    
			}    /** Called when the activity is first created. */    
		@Override    
		public void onCreate(Bundle icicle) {        
			super.onCreate(icicle);        
			setContentView(R.layout.main);           
			//        LinearLayout l1 = new LinearLayout(this);
			//        l1.setScrollContainer(true);
			//        l1.setOrientation(LinearLayout.VERTICAL);
			//        setContentView(l1);               
			db_create = (Button)findViewById(R.id.Button01);        
			db_create.setText("Database 작성");        
			db_create.setOnClickListener(new OnClickListener() {
			}@Override			
			public void onClick(View v) {				
				// TODO Auto-generated method stub				
				db = openOrCreateDatabase(DB_NAME, DB_MODE, null);				
				Log.i("database test", DB_NAME + " Database create");			
				}		
			});               
			//l1.addView(db_create, createParam(WC,WC));                
			table_create = (Button)findViewById(R.id.Button02);        
			table_create.setText("Table 만들기");        
			table_create.setOnClickListener(new OnClickListener() {						
				@Override			
				public void onClick(View v) {				
					// TODO Auto-generated method stub				
					String sql = "create table " + TABLE_NAME + 
							"(id integer primary key autoincrement, " + 
							"voca text not null)";
					try{					
						db.execSQL(sql);					
						Log.i("databasetest", TABLE_NAME + "Table create");				
						}catch(SQLException e){									
							
						}			
					}		
				});
			//        l1.addView(table_create, createParam(WC, WC));                
			del_table = (Button)findViewById(R.id.Button03);        
			del_table.setText("Table 삭제");        
			del_table.setOnClickListener(new OnClickListener() {						
				@Override			
				public void onClick(View v) {				
					// TODO Auto-generated method stub				
					String sql = "drop table " + TABLE_NAME;				
					try{					
						db.execSQL(sql);					
						Log.i("database test", "Table delete");				
						}catch(SQLException e){									
							
						}			
					}		
				});
			//        l1.addView(del_table, createParam(WC, WC));                
			data_insert = (Button)findViewById(R.id.Button04);        
			data_insert.setOnClickListener(new OnClickListener() {						
				@Override			
				public void onClick(View v) {				
					// TODO Auto-generated method stub				
					numofVoca = numofVoca +1;				
					String voca = EdT_voca.getText().toString();				
					String sql = "insert into " + 
					TABLE_NAME + " (id, voca) values( '" + numofVoca +						
					"', '" + voca +"' );";				
					try{					
						db.execSQL(sql);					
						Log.i("database test", " Data Value Insert");				
						}catch(SQLException e){									
							
						}			
					}		
				});
			//        l1.addView(data_insert, createParam(WC, WC));                
			EdT_voca = (EditText)findViewById(R.id.EditText01);//        
			l1.addView(EdT_voca, createParam(FP, WC));               
			data_update = (Button)findViewById(R.id.Button05);        
			data_update.setOnClickListener(new OnClickListener() {						@Override			
				public void onClick(View v) {				
				// TODO Auto-generated method stub				
				String updateID = EdT_updateId.getText().toString();				
				String updateTitle = EdT_updateVoca.getText().toString();								
				String sql = "update " + TABLE_NAME + " set title='" + updateTitle + 
						"' where id=" + updateID + ";";				
				try{					
					db.execSQL(sql);					
					Log.i("Database test", " Data Value Update");				
					}catch(SQLException e){				
						
					}			
				}		
			});
			//        l1.addView(data_update, createParam(WC, WC));                
			EdT_updateVoca = (EditText)findViewById(R.id.EditText03);
			//        l1.addView(EdT_updateId, createParam(FP, WC));    
			}
		}
	}
내용]
해보니 의외로 쉬웠다...(이걸 하루동안 잡고 있었다니!!)
말 그대로 생성해서 쓰면된다.

그럼 이제 읽어와서 사용해보도록 해봐야겠다...
참고로 주석처리한 부분은 groupview로 해서 하나로 처리하는 구문인데 그냥 보기 편하라고 리스너를 따로 지정했다.

그리고 여기서 생성한 db는 어플리케이션이 삭제되지 않는한 에뮬레이터에 저장되어 있다.
위치는 DDMS에 File Explorer 에
/data/data/프로젝트의 package/databases 에 자신이 생성한 db이름으로 저장되어있다.
이것을 상단에 보면 pull a file from the device 라는 아이콘을 눌러서 외부로 빼낼 수 있다.

이걸 나는 SQLite browser를 이용해서 내용을 보았다.


이건 시뮬레이션에서 버튼을 눌러 디비 생성, 테이블생성, 아이템 추가 할때의 Logcat내용
보면 Log로 설정한 내용이 찍히는것을 확인 할 수 있다.