2012-07-16 3 views
1

정기적으로 업데이트하는 안드로이드 앱에 읽기 전용 데이터베이스가 있습니다. 앱에는 항상 최신 버전의 데이터베이스가 포함되어 있습니다.SQLiteOpenHelper onUpgrade가 여러 번 호출되었습니다

나는 버전 (이 경우)를 지원 해주, 내 SQLiteOpenHelper 서브 클래스의 생성자에 전달하는 버전 번호를 증가 4.

나는 다음과 같은 코드가 있습니다

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // copy from assets to local storage; version really doesn't matter; 
    // DB will be opened from the target location. 
    copyDataBase(); 
} 

이 가져가 내가 전화를 걸 때 호출 읽을 수있는 데이터베이스를 얻을 수 있습니다 :

SQLiteDatabase db = myDBHelper.getReadableDatabase(); 
// Here db.getVersion() correctly returns "4", the newVersion. 
// db is also usable and has the correct data. 

을하지만 getReadableDatabase onUpgrade를 호출 할 때마다이 NEWVERSION = 4 oldVersion = 3에서 호출됩니다.

버전이 고집하지 않는 이유는 무엇입니까?

+0

활동에서 코드를 호출하는 방법에 대한 코드를 보는 것이 도움이 될 수 있습니다. – Nate

답변

1

글쎄 몇 가지.

"copyDataBase()"호출은 이전 버전의 코드가 저장된 db의 일부 저장된 복사본을 복사 할 수 있으므로 조금 의심 스럽습니다. db.getVersion()은 도우미 클래스의 생성자에 전달 된 내용을 사용하고 실제로 어디서나 읽지 않습니다. 그래서 나는 그것을 두 번 확인하거나 게시 할 것입니다. 또한

당신이 정말로 당신의 서브 클래스에서 슈퍼 생성자를 호출하고 있는지 확인 :

DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     Log.d("DatabaseHelper", "constructor. Version="+DATABASE_VERSION); 
    } 

을 지 확인하십시오 로그 출력은 귀하의 경우 "4"가 아닌 3을 보여줍니다.

+0

감사합니다. 사실 copy (db의 이전에 저장된 복사본)의 바이트를 로컬 저장소에 그대로 복사하기 때문에 copyDataBase() 호출 복사본이 포함되지 않았습니다. (실제로 위와 같이 슈퍼 생성자를 호출하면 Log.d는 "4"를 예상대로 출력합니다.) 따라서 저장된 db에 버전 코드가 포함되어 있으면 변경해야 할 곳은 어디입니까? 감사! –

+0

아하 - 여기에 답변이 있습니다. http://stackoverflow.com/questions/8030779/change-sqlite-database-version-number. 복사 된 데이터베이스에서 버전을 설정하려면 pragma를 수행해야합니다. 감사! –

1

이것은 단지 추측에 불과합니다. 나는이 포스트를 가로 질러 왔을 정도로 같은 문제를 안고 있었다. 나는 나중에 sqLiteDatabase.beginTransaction();sqLiteDatabase.endTransaction(); 을 사용하고 있었지만 거래를 끝내기 전에 sqLiteDatabase.setTransactionSuccessful();을 호출하지 않았다는 것을 깨달았습니다. 나는 그것을 넣고 고쳤다. 내가 꽤 늦게 알고 있지만 희망이 도움이됩니다.

+0

당신은 내 하루를 만들어 주셔서 고마워요. –

관련 문제