2017-09-20 3 views
0

이전에 데이터베이스 버전을 '0'으로 만드는 db = openOrCreateDatabase("LOCALTILEDB", Context.MODE_PRIVATE, null);을 사용하여 데이터베이스를 만들었습니다.버전 0에서 1 로의 SQLite 데이터 이전

응용 프로그램의 다음 버전에서는 OnUpgrade 메서드가 호출 된 오류를 표시하는 SQLiteOpenHelper 클래스를 사용하고 있습니다. 데이터베이스 버전은 '0'이 될 수 없습니다.

DB의 0 버전에서 버전 1 DB로 데이터를 마이그레이션하는 데 도움을 주시기 바랍니다.

+1

아직까지는이 부분을 살펴 보지 못했지만 현재 할 수있는 것은 (getWriteableDatabase()를 사용하여) 현재 데이터베이스를 열고 ' execSQL' 메소드, 다음 SQL' PRAGMA user_version = 1'. 그러나 버전 번호를 변경하는 방법은 다음과 같습니다. 나는 내가 생각해 낼 수있는 것을보기 위해 약간의 연극을 가질 것이다. – MikeT

+0

답변에 따라 PRAGMA를 사용하여 버전을 변경할 필요가 없습니다. – MikeT

답변

0

SQLiteOpenHelper로 확장되는 클래스에서 기본 생성자에 super (context, DATABASE_NAME, null, DATABASE_VERSION)를 전달하십시오. 예를 들어.

public class MyDBHelper extends SQLiteOpenHelper { 

// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "MyDb"; 


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

@Override 
public void onCreate(SQLiteDatabase aSqLiteDatabase) { 

} @Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 

} 

}

0

난 당신이 무슨 짓을했는지 슈퍼 예를 통해 전달 된 0의 버전을 코딩하는 것으로 의심 -

public static final int DBVERSION = 0; 

public SO46316125DBHlpr(Context context) { 
    super(context, DBNAME, null, DBVERSION); 
} 

Version must be >= 1, was 0

예를 포함하는 예외가 발생할 것 -

09-20 21:16:40.631 1840-1840/mjt.soqanda E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: mjt.soqanda, PID: 1840 
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{mjt.soqanda/mjt.soqanda.MainActivity}: java.lang.IllegalArgumentException: Version must be >= 1, was 0 
                   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                   at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                   at android.os.Looper.loop(Looper.java:135) 
                   at android.app.ActivityThread.main(ActivityThread.java:5254) 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at java.lang.reflect.Method.invoke(Method.java:372) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                  Caused by: java.lang.IllegalArgumentException: Version must be >= 1, was 0 
                   at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:99) 
                   at android.database.sqlite.SQLiteOpenHelper.<init>(SQLiteOpenHelper.java:77) 
                   at mjt.soqanda.SO46316125DBHlpr.<init>(SO46316125DBHlpr.java:23) 

하지만, 단순히 0이 아닌 양의 부호화 된 버전, 즉 슈퍼 방법에 전달되며, 그 버전에서 사용되는 결과 것이다.


나는() 버전을 검색 PRAGMA user_version 다음, PRAGMA user_version=0를 사용하여 버전 0 (이 될 수있는 DB를 설정하고있는 한 -

09-20 21:29:35.117 19172-19172/? D/DBVERSION: The Database User Version is 1 
09-20 21:29:35.118 19172-19172/? D/CHGDBVERSION: Attempting to alter DB Version from 1 to new version 0 
09-20 21:29:35.152 19172-19172/? D/CHGDBVERSION: DB Version changed successfully, DB Version is now 0 

그때 사용 버전 100 : -

public static final int DBVERSION = 100; 

public SO46316125DBHlpr(Context context) { 
    super(context, DBNAME, null, DBVERSION); 
} 

그래서이 직접 점프 버전으로 100 (onUpgrade 방법은 비어)에 따라 : -. 1 개 작품뿐만 아니라 물론

09-20 21:35:45.344 27937-27937/mjt.soqanda D/DBVERSION: The Database User Version is 100 

012 위의 생산 테스트를위한 317,894,922,398,581,088,243,210

는/I는 다음과 같은 방법을 사용 : - 1 MainActivity에서 다음 코드로 Android: PRAGMA statements that set data don't work

에 따라에는 ExecSQL를 사용할 필요가 작동하지 않습니다

public void showDBVersion() { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor csr = db.rawQuery("PRAGMA user_version",null); 
    if (csr.moveToFirst()) { 
     Log.d("DBVERSION","The Database User Version is " + csr.getString(0)); 
    } 
} 


public int alterDBVersion(SQLiteDatabase db, int fromversion, int toversion) { 

    int current_version = -1; 
    int changed_version = -1; 

    Cursor csr = db.rawQuery("PRAGMA user_version;",null); 
    if (csr.moveToFirst()) { 
     current_version = csr.getInt(0); 
    } else { 
     Log.d("CHGDBVERSION","Unable to get the current version."); 
     return current_version; 
    } 

    if (current_version == fromversion) { 
     Log.d("CHGDBVERSION","Attempting to alter DB Version from " + 
       Integer.toString(fromversion) + 
       " to new version " + 
       Integer.toString(toversion) 
     ); 
     db.rawQuery("PRAGMA user_version=" + Integer.toString(toversion) + ";",null); //NOTE 1 
     db.execSQL("PRAGMA user_version=" + Integer.toString(toversion) + ";"); 
    } 

    csr = db.rawQuery("PRAGMA user_version;",null); 
    if (csr.moveToFirst()) { 
     changed_version = csr.getInt(0); 
    } else { 
     Log.d("CHGDBVERSION","Unable to get the new/changed version."); 
     return -2; 
    } 
    if (current_version != fromversion || changed_version != toversion) { 
     Log.d("CHGDBVERSION", 
       "DB Version was not changed as requested. Version is now " + 
         Integer.toString(changed_version)); 
     return -3; 
    } else { 
     Log.d("CHGDBVERSION","DB Version changed successfully, DB Version is now " + 
     Integer.toString(changed_version)); 
    } 
    return 0; 
} 

참고

SO46316125DBHlpr dbhlpr = new SO46316125DBHlpr(this); 
    dbhlpr.showDBVersion(); 
    dbhlpr.alterDBVersion(dbhlpr.getWritableDatabase(),1,0); 

분명히 매개 변수를 변경합니다 (첫 번째 버전은 변경할 버전이므로 현재 버전과 일치해야하며 두 번째 버전은 변경할 버전입니다. 첫 번째가 일치하는 경우). 위의 예제는 버전 1을 버전 0으로 바꿀 것입니다.