programing

SQLiteOpenHelper onCreate() / onUpgrade()는 언제 실행됩니까?

codeshow 2023. 8. 5. 11:09
반응형

SQLiteOpenHelper onCreate() / onUpgrade()는 언제 실행됩니까?

에 표를 .SQLiteOpenHelper onCreate()그러나 받음

SQLiteException: no such table

또는

SQLiteException: no such column

오류. 왜요?

참고:

(이것은 매주 수십 개의 유사한 질문을 종합한 것입니다.여기서 모든 질문이 좋은 참조로 유도될 수 있도록 "규례적인" 커뮤니티 위키 질문/답변을 제공하려고 시도합니다.)

SQLiteOpenHelper onCreate() 및 콜백은 데이터베이스가 실제로 열릴 때 호출됩니다(예: 에 대한 호출).데이터베이스 도우미 개체 자체를 만들 때는 데이터베이스가 열리지 않습니다.

SQLiteOpenHelper데이터베이스 파일의 버전을 지정합니다.는 버전번다같습다니음과호는입니다.int생성자에게 전달된 인수입니다.데이터베이스 파일에서 버전 번호는 에 저장됩니다.

onCreate()데이터베이스 파일이 존재하지 않고 방금 생성된 경우에만 실행됩니다.onCreate()를 성공적으로 반환합니다(예외를 던지지 않음). 데이터베이스는 요청된 버전 번호로 생성된 것으로 가정됩니다.암시로, 당신은 그것을 잡아서는 안됩니다.SQLException죄를 짓는onCreate()네 자신.

onUpgrade()데이터베이스 파일이 존재하지만 저장된 버전 번호가 생성자에서 요청한 것보다 낮을 때만 호출됩니다.onUpgrade()테이블 스키마를 요청한 버전으로 업데이트해야 합니다.

때(코드에서테때변경할를스키마이블▁(때▁the)onCreate()), .), 데이터베이스가 업데이트되었는지 확인합니다. 가지 접근 방식 가 지 주 접 방 식 근 두 요 : 방 :

  1. 이전 데이터베이스 파일을 삭제하여 다음 작업을 수행합니다.onCreate()다시 실행됩니다.설치된 버전을 제어할 수 있고 데이터 손실이 문제가 되지 않는 개발 시점에 이 기능을 사용하는 것이 좋습니다.데이터베이스 파일을 삭제하는 몇 가지 방법:

    • 응용 프로그램을 제거합니다. 프로그램 "응용 프로그램 관리자"를 사용합니다.adb uninstall your.package.name

    • 응용 프로그램 데이터를 지웁니다.응용 프로그램 관리자를 사용합니다.

  2. 을 "" " " " " " " " " 으로 시킵니다.onUpgrade() 많은 필요한 합니다.코드가 더 많이 필요하기 때문에 이것은 약간 더 복잡합니다.

    • 가 되지 업그레이드의 에는 데터손실문되지않개시스업발간의경드있다수니습다사우용할음이을그이키레마이를 사용하면 됩니다.execSQL("DROP TABLE IF EXISTS <tablename>")하고 기존테고제호출다니합하거을블이다▁in니▁to▁remove호합출을 호출합니다.onCreate()데이터베이스를 다시 만듭니다.

    • 버전의 을 릴스된버경다데마합이구니다에서 .onUpgrade()사용자가 데이터를 잃지 않도록 합니다.

Jaskey의 요청에 따라 여기에 누락된 점을 추가하려면

은 터베이버내저다니에 됩니다.SQLite데이터베이스 파일.

캐치가 생성자입니다.

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

될 때nameparam), 정보를 콜백("callback")을 .

이전 답변에서 이미 설명했듯이 이름을 가진 데이터베이스가 존재하지 않으면 트리거됩니다.onCreate.

아래 설명은 다음과 같습니다.onUpgrade 예를 들어 합니다.

예를 들어, 당신의 첫 번째 버전의 애플리케이션은DatabaseHelper)로 표시됩니다.SQLiteOpenHelper와 함께 버전이 )입니다.1그런 다음 버전이 전달된 새 소스 코드로 업그레이드된 응용 프로그램을 제공했습니다.2그런 다음 자동으로.DatabaseHelper 트리거 생됨성, 플폼트거onUpgrade파일이 이미 존재하지만 버전이 사용자가 전달한 현재 버전보다 낮습니다.

이제 DB 버전을 사용하여 세 번째 버전의 애플리케이션을 제공할 계획이라고 가정합니다.3(DB 버전은 데이터베이스 스키마를 수정할 때만 증가합니다.)에서는 더 가능한 각 해야 합니다.

아래의 유사 코드 예:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  switch(oldVersion) {
    case 1:
       //upgrade logic from version 1 to 2
    case 2:
       //upgrade logic from version 2 to 3
    case 3:
       //upgrade logic from version 3 to 4
       break;
    default:
       throw new IllegalStateException(
                "onUpgrade() with unknown oldVersion " + oldVersion);
  }
}

된 없진것주목요에 하세요.break1그리고.2이것이 제가 의미하는 점증적 업그레이드입니다.

이전 버전의 경우 다음과 같이 말합니다.2은 그고새로버전은입니다.4는 그면논데이업를스그합다니드이레에서 데이터베이스를 입니다.23 그다에음으로.4

이 전이버경우인 3은 그고새로버전은입니다.4▁logic▁for▁run에 대한 업그레이드 로직만 합니다.34

onCreate()

  1. 하지 않음) " " " " " " (", "" " " " " " " " " " " " " " " " " " " " "는 " " " " 입니다.onCreate() 버사데전생성스이로 으로 데이터베이스 SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

  2. onCreate()메소드는 정의한 테이블을 만들고 작성한 다른 코드를 실행하는 것입니다.이는 앱의 디렉토리(됩니다./data/data/your.apps.classpath/databases).

  3. 코드를 변경하고 에뮬레이터에서 다시 시작한 경우에는 이 메서드가 호출되지 않습니다.네가 원한다면onCreate()를 실행하려면 SQLite 데이터베이스 파일을 삭제하기 위해 adb를 사용해야 합니다.

onUpgrade()

  1. SQLiteOpenHelper슈퍼 컨스트럭터를 불러야 합니다.
  2. onUpgrade() 중인 가 큰 됩니다.
  3. 만약 당신이 원한다면,onUpgrade()메서드를 호출하려면 코드에서 버전 번호를 증분해야 합니다.

제가 너무 늦었을 수도 있지만 짧고 달콤한 답변을 나누고 싶습니다.동일한 문제에 대한 답변을 확인하십시오.분명히 도움이 될 겁니다.더 이상 상세 사양은 없습니다.

테이블을 만들기 위한 구문을 확신하는 경우 동일한 테이블에 새 열을 추가할 때 발생할 수 있습니다.

장치에서 제거한 후 다시 실행합니다.

OR

설정 -> 앱 -> 데이터 지우기

OR

거스름DATABASE_VERSIONDatabaseHandler" 클래스(새 열을 추가한 경우 자동으로 업그레이드됨)

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

OR

거스름DATABASE_NAME"DatabaseHandler" 클래스에서 (저도 같은 문제에 직면했습니다.)하지만 나는 변화를 통해 성공합니다.DATABASE_NAME.)

할 때 기억해야 할 사항 할사항을 확장할 때해야 할 SQLiteOpenHelper

  1. super(context, DBName, null, DBversion);이것은 생성자의 첫 번째 줄에서 호출되어야 합니다.
  2. 오라이드를 합니다.onCreate그리고.onUpgrade한 경우) (필요한 경우)
  3. onCreate다음과 같은 경우에만 호출됩니다.getWritableDatabase()또는getReadableDatabase()실행됩니다.그리고 이것은 한 번만 호출될 것입니다.DBName첫 번째 단계에서 지정한 항목을 사용할 수 없습니다.테이블 생성 조회를 다음에 추가할 수 있습니다.onCreate방법
  4. 하십시오.DBversion에서 쿼리를 수행합니다.onUpgrade테이블로 이동하거나 간단히 제거한 후 앱을 설치합니다.

다음과 같이 데이터베이스 및 테이블을 만들 수 있습니다.

public class DbHelper extends SQLiteOpenHelper {
private static final String DBNAME = "testdatbase.db";
private static final int VERSION = 1;

public DbHelper(Context context) {
    super(context, DBNAME, null, VERSION);
    // TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("create table BookDb(id integer primary key autoincrement,BookName text,Author text,IssuedOn text,DueDate text,Fine text,Totalfine text");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS BookDb");
    onCreate(db);
  }
}

참고: 다른 테이블을 만들거나 열을 추가하거나 테이블을 추가하지 않으려면 VERSION을 증가시키십시오.

테이블을 만들어야 할 때 처음으로 onCreate를 호출합니다.SQLiteDatabase에서 실행되는 테이블 생성 스크립트를 작성하는 이 방법을 재정의해야 합니다.execSQL 메서드입니다.처음 배포할 때 이 메서드를 실행하면 이후에는 호출되지 않습니다.

onUpgrade 이 메서드는 데이터베이스 버전이 업그레이드될 때 호출됩니다.첫 번째 배포에서는 데이터베이스 버전이 1이었고 두 번째 배포에서는 테이블에 열을 추가하는 등 데이터베이스 구조가 변경되었다고 가정합니다.데이터베이스 버전이 지금 2라고 가정합니다.

SQLite 데이터베이스가 두 가지 메서드를 재정의합니다.

생성 시():이 메서드는 응용 프로그램이 처음 시작될 때 한 번만 호출됩니다.그래서 딱 한 번 전화가 왔습니다.

onUpgrade() 데이터베이스 버전을 변경하면 이 메서드가 호출됩니다.DB Schema를 작성한 후 새 열을 추가하는 등 테이블 구조 변경에 사용됩니다.

에뮬레이터 또는 장치에서 응용 프로그램을 제거합니다.앱을 다시 실행합니다. (데이터베이스가 이미 존재하는 경우 OnCreate()는 실행되지 않습니다.)

이러한 테이블은 주로 당신이 열지 않았을 때 발견됩니다.SQLiteOpenHelper 있는 getwritabledata()그리고 그 전에 당신은 또한 데이터베이스 이름과 버전을 가진 make constructor를 호출해야 합니다. 그리고.OnUpgrade는 에지 버번전업호값그있이호때다출니에 됩니다.SQLiteOpenHelper학생들

다음은 코드 조각입니다. 열 이름의 철자 때문에 이러한 열을 찾을 수 없습니다.

public class database_db {
    entry_data endb;
    String file_name="Record.db";
    SQLiteDatabase sq;
    public database_db(Context c)
    {
        endb=new entry_data(c, file_name, null, 8);
    }
    public database_db open()
    {
        sq=endb.getWritableDatabase();
        return this;
    }
    public Cursor getdata(String table)
    {
        return sq.query(table, null, null, null, null, null, null);
    }
    public long insert_data(String table,ContentValues value)
    {
        return sq.insert(table, null, value);
    }
    public void close()
    {
        sq.close();
    }
    public void delete(String table)
    {
        sq.delete(table,null,null);
    }
}
class entry_data extends SQLiteOpenHelper
{

    public entry_data(Context context, String name, SQLiteDatabase.CursorFactory factory,
                      int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase sqdb) {
        // TODO Auto-generated method stub

        sqdb.execSQL("CREATE TABLE IF NOT EXISTS 'YOUR_TABLE_NAME'(Column_1 text not null,Column_2 text not null);");

    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          onCreate(db);
    }

}

생성자에게 두 번째 인수로 "이름" 문자열을 제공하는 것을 잊으면 앱을 닫으면 지워지는 "메모리 내" 데이터베이스가 생성됩니다.

데이터베이스 이름은 .db로 끝나야 하며 쿼리 문자열에는 종결자(;)가 있어야 합니다.

DatabaseHandler/DatabaseManager 클래스에서 쿼리를 다시 확인합니다.

에는 XML 에서 XML 파일의 .<string-array>에 가내보하는곳관곳▁where.<item> 이들안에에.<item> s SQL로 합니다.databaseBuilder.addMigrations(migration)제가 한 가지 실수를 했습니다. 추가하는 것을 잊었습니다.\인용하기 전에 예외가 발생했습니다.

안드로이드. 안드로이드.사철석의SQLiteException: 해당 열 없음: some_value(코드 1 SQLITE_ERROR): , 컴파일 중: INSERT INTO table_name(id, name) VALUES(1, some_value)

이것은 올바른 변형입니다.

<item>
    INSERT INTO table_name(id, name) VALUES(1, \"some_value\")
</item>

SQLiteopenhelper의 메서드는 메서드를 만들고 업그레이드합니다. 테이블을 처음 만들 때 create가 사용되며 테이블의 열 수가 변경될 때마다 업그레이드 메서드가 호출됩니다.

언급URL : https://stackoverflow.com/questions/21881992/when-does-sqliteopenhelper-oncreate-onupgrade-run

반응형