2012-11-17 7 views
0

this tutorial을 사용하여 안드로이드에서 Sqlite를 사용하는 방법을 배우고 있습니다. 일부 코드를 이해하는 데 문제가 있습니다.Android에서 Sqlite 사용

public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
       + KEY_PH_NO + " TEXT" + ")"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 
    } 

내 활동에서 DatabaseHandler의 새 개체를 만듭니다. 생성자의 슈퍼는 SQLiteOpenHelper 생성자입니다. 이 코드는 훌륭하게 작동하고, 새로운 데이터베이스를 생성하며, 존재하지 않으면 새로운 데이터베이스를 만듭니다. 나는이 코드에 약간의 변경을 가하고 싶다. (나는 하나의 db에 다른 테이블을 추가하고 싶다.)하지만 정확히 어떻게이 작업을하는지 이해하지 못한다. 생성자가 새로운 db를 생성하거나 기존의 것을 사용해야한다면 어떻게 알 수 있을까?

답변

3

트릭은 클래스가 SQLiteOpenHelper를 확장한다는 것입니다. 생성자에서 super을 호출하면 많은 비하인드 코드가 트리거됩니다.

SQLiteOpenHelper source code을 읽는 경우 getWritableDatabase()getReadableDatabase()은 동일한 방법 (SQLiteOpenHelper#getDatabaseLocked())을 호출합니다. 이 방법은 대부분의 작업을 수행합니다. 하나의 간단한 명령으로 제공 한 정보 (예 : super(context, DATABASE_NAME, null, DATABASE_VERSION);)에서 데이터베이스를 생성, 열기 또는 업그레이드해야하는지 여부를 결정합니다.

+0

확인. 그러나 테이블을 생성하는 onCreate 함수는 언제 호출됩니까? –

+0

데이터베이스가 존재하지 않으면'getWritableDatabase()'를 호출 한 후에 만 ​​SQLiteOpenHelper에 의해 호출됩니다. – Sam

+0

그러나 기존 DB에 새 테이블을 만들려면 어떻게해야합니까? –

2

db를 열려면 SQLiteOpenHelper.getReadableDatabase() 또는 SQLiteOpenHelper.getWriteableDatabase()를 호출하십시오. 데이터베이스가 존재하면 핸들이 리턴됩니다. 존재하지 않으면 시스템은 onCreate()를 호출합니다. 여기서 db.execSQL을 수행합니다.

DatabaseHandler 대신 DatabaseOpenHelper 클래스를 호출하는 것이 좋습니다. 그것이하는 일은 다른 클래스의 시작 부분에 데이터베이스를 생성하는 것이 아니라 필요할 때까지 데이터베이스를 만드는 것을 연기하는 것입니다. 이것은 특히 SQLite 데이터베이스가 뒷받침되는 컨텐츠 제공자에게 유용합니다. 매우 빠른 초기화를하려면 ContentProvider.onCreate()를 사용하고 SQLiteOpenHelper.onCreate()를 구현하여 데이터베이스를 만들어야합니다. 그렇게하면 앱이 시작될 때 ContentProvider를로드 할 수 있지만 액세스하려고 시도 할 때까지는 데이터베이스에서 아무 것도하지 않아도됩니다.