프로그래밍 정리/안드로이드

assets에 db넣고 사용하기 -개념이해-

주누다 2012. 7. 6. 10:20
반응형

주소 : http://adamjin.egloos.com/2875879




assets에 db를 넣고 사용하는 방법은 두가지가 있다.
Adapter를 사용하는 방법과 Activity에 Adapter를 생성해서 사용하는 방법이다.
두가지 상황에 맞춰서 assets의 db를 불러오는 방법의 차이점을 아래의 코드를 보면 쉽게 이해할 수 있을 것이다.
(필자는 어느 곳도 이걸 설명한 곳이 없어 너무 고생을 했다. 나같이 고생하지 않기를 바라는 맘으로 글을 올린다.)

Adapter에서 사용예제.
포인트~!! 
Context사용해서 연결한다.

public class DatabaseHelper extends SQLiteOpenHelper{    
  public static final String ROOT_DIR = "/data/data/팩키지명/databases/";  //로컬db 저장    
  private static final String DATABASE_NAME = "sample.sqlite"; //로컬db명   
  private static final int SCHEMA_VERSION = 1; //로컬db 버전
        
public DatabaseHelper(Context context)    {        
  super(context, DATABASE_NAME, null, SCHEMA_VERSION);                
  setDB(context); // setDB에 context 부여    
}     
       
@Override        
public void onCreate(SQLiteDatabase db) {                    
}
        
@Override       
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                    }      


public static void setDB(Context ctx) {           
  File folder = new File(ROOT_DIR);         
  if(folder.exists()) {           
} else {          
  folder.mkdirs();          
}           
  AssetManager assetManager = ctx.getResources().getAssets(); //ctx가 없으면 assets폴더를 찾지 못한다.           
  File outfile = new File(ROOT_DIR+"sample.sqlite");                  
  InputStream is = null;              
  FileOutputStream fo = null;           
  long filesize = 0;                
     try {             
  is = assetManager.open("sample.sqlite", AssetManager.ACCESS_BUFFER);               
  filesize = is.available();             
    if (outfile.length() <= 0) {             
  byte[] tempdata = new byte[(int) filesize];             
  is.read(tempdata);              
  is.close();               
  outfile.createNewFile();             
  fo = new FileOutputStream(outfile);             
  fo.write(tempdata);             
  fo.close();                
  } else {}            
  } catch (IOException e) {}       
  }    
    // 이곳에 public으로 쿼리코드 생성
  }

Activity에서 사용 예
포인트~~!! Adapter를 별도로 생성해서 사용한다.

public class TestActivity extends Activity {    
  public static final String ROOT_DIR = "/data/data/패키지명/databases/";    
  public SQLiteDatab-se db; // adapter 속성 정의    
  public Cursor cursor;    
  ProductDBHelper mHelper; // adapter 생성 정의        
   /-* Called when the activity is first created. *-    
 @Override    
 public void onCreate(Bundle savedInstanceState) {        
   super.onCreate(savedInstanceState);               
     setDB();        // setDB에 Context가 없다.        
     mHelper=new ProductDBHelper(this);               
    db=mHelper.getWritableDatabase();        
      cursor=db.rawQuery("SELECT * FROM sample order by name",null); //쿼리문        
    startManagingCursor(cursor);    
}        

public static void setDB() {         //setDB에 Context가 없다.         
   File folder = new File(ROOT_DIR);         
   if(folder.exists()) {           
     } else {           
   folder.mkdirs();          
   }           
  AssetManager assetManager = getResources().getAssets();       //ctx가 없다.           
  File outfile = new File(ROOT_DIR+"sample.sqlite");                  
  InputStream is = null;              
  FileOutputStream fo = null;           
  long filesize = 0;                
     try {             
      is = assetManager.open("sample.sqlite", AssetManager.ACCESS_BUFFER);               
   filesize = is.available();            
     if (outfile.length() <= 0) {             
       byte[] tempdata = new byte[(int) filesize];            
    is.read(tempdata);              
    is.close();              
    outfile.createNewFile();             
    fo = new FileOutputStream(outfile);             
    fo.write(tempdata);             
    fo.close();                
      } else {}            
        } catch (IOException e) {}       
}
          
class ProductDBHelper extends SQLiteOpenHelper{  //새로 생성한 adapter 속성은 SQLiteOpenHelper이다.        
   public ProductDBHelper(Context context) {            
   super(context, "sample.sqlite", null, 1);    // db명과 버전만 정의 한다.            
     // TODO Auto-generated constructor stub        
  }
        
@Override        
  public void onCreate(SQLiteDatabase db) {           
   // TODO Auto-generated method stub                    
}        
@Override       
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {            
// TODO Auto-generated method stub                   
 }                
}
}

반응형