2011-05-13 3 views
5

정말 내 애플 리케이션에서 SqlLite를 사용하여 고군분투하고있다; 내 앱이 좀 XML을 파싱하고 시작하면안드로이드 SQLite 어디서 언제 SQLiteOpenHelper 초기화

public void onCreate(SQLiteDatabase db) { 
db.execSQL("CREATE TABLE myTestTable (Id INTEGER PRIMARY KEY , " 
      + "info TEXT," + 
      + "TopLeft TEXT")); <-- example insert 

} 

: 나는 약 6 테이블을 작성하고있는 한 OnCreate에서 SQLiteOpenHelper

에서
public class DatabaseHelper extends SQLiteOpenHelper { 

를 확장하는 데이터베이스 헬퍼 클래스를 설정 한

테이블에 데이터를 입력하고 데이터베이스를 점검하고 거기에 모든 것이 있고 테이블이 올바르게 작성되었습니다.

데이터를 호출하려고하면 사라집니다! dbhelper 클래스와 각 액티비티 내에서 여러 가지 다른 쿼리가 있는데 클래스를 초기화하여 클래스 내 함수를 가져올 수 있습니다.

내 oncreate를 다시 실행하고 모든 테이블을 지우는 방법으로이 방법을 사용하지 않는 것으로 가정합니다. (또는 적어도 이것은 데이터를 호출 한 후에 DB를 확인하는 것처럼 보입니다. 그것과 내가 한 OnCreate 한 번만 실행 한 인상이었다

! 빈,하지만 내 DB 매번를 다시 내 데이터를 닦는 것으로 보인다 이것은 분명히 사실이 아니다! 당신이 의미

dbhelper 클래스를 초기화하고 테이블을 다시 만드는 것을 어떻게 멈추게합니까? 응용 프로그램이 닫히더라도 데이터가 지속되어야합니다!

나는 혼란스러워!

이것이 이해가되지 않는다면 명확하게 설명 할 수있는 구체적인 질문을하십시오.

UPDATE

나는

테이블을 재 작성을 중지
CREATE TABLE IF NOT EXISTS 

을 추가 할 수 있습니다 발견,하지만 여전히 .. 오른쪽에서 OnCreate 때마다 호출하지 않는 것

+0

좋은 질문 나는 누군가가 지금까지 당신은하지만 "삽입"데이터베이스를 닫기 전에 성공적인 트랜잭션을 표시하는 등, 해답을 제공 희망? –

+0

클래스를 정적으로 선언하면 문제가 해결됩니까? –

+0

@DAVE G 모든 데이터가 확실히 DB에 들어갑니다. 삽입 후에 DB를 닫으려고합니까? 현재 수행 중 : \t SQLiteDatabase db = this.getWritableDatabase(); .... 모든 데이터를한데 모으고 : db.insert ("TABLENAME", null, cv); ... 그리고 그게 끝이야?! – Bex

답변

2

주위에 래퍼 클래스를 추가 할 수 있습니까?

public class DbAdapter 
{ 

    // database details 
    private static final String DATABASE_NAME = "dbname"; 
    private static final int DATABASE_VERSION = 1; 

    // where we're running 
    private final Context mCtx; 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     // your initial database create statements go here 
     db.execSQL(DATABASE_CREATE); 
    } 

    // if you need to recreate the database, you just up the version number 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     // drop commands for each table goes here 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 
    } 

    public DbAdapter(Context ctx) 
    { 
    this.mCtx = ctx; 
    } 

    public DbAdapter open() throws SQLException 
    { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
    } 

    public void close() 
    { 
    mDbHelper.close(); 
    } 

    // other database methods can go here 
} 
0

나는 당신이 성명을 통해 무엇을 의미하는지 확신 할 수 없다. -

"각 액티비티는 내가 초기화 할 수 있도록 다시 초기화한다. 수업 내 내 기능. "

데이터베이스에 액세스해야하는 각 작업에서 데이터베이스를 열고 테이블의 데이터에 액세스/업데이트 한 다음 처리기를 닫으면됩니다.

당신은이 간단한 샘플 메모장 응용 프로그램을 본 적이 -

NotePad sample app by Google

가 그

1

onCreate() 방법은 당신에게 데이터베이스에 액세스하려고이 생성되지 유일 처음이라고합니다 도움이 될 수 있음. 따라서 onCreate()은 한 번만 호출됩니다. getWritableDatabase은 db 개체를 반환하고 필요한 경우 onCreate()을 호출합니다. NotePadProviderSQLiteOpenHelper을 사용하는 좋은 예입니다.

+0

처음 데이터베이스에 액세스 할 때, 현재 또는 현재의 "세션"중에 무슨 뜻입니까? – Bex

+0

내 말은 .... –

+0

NotePad 샘플 앱에 대한 링크가 끊어졌습니다. 이사 가면 어떨까요? – syonip

0

DB 초기화 코드는 Helper의 onCreate 메소드에 있어야합니다. 안드로이드 SQLiteOpenHelper의의 javadoc에서 :

/** 
* Called when the database is created for the first time. This is where the 
* creation of tables and the initial population of the tables should happen. 
* 
* @param db The database. 
*/ 
public abstract void onCreate(SQLiteDatabase db);