เวอร์ชันฐานข้อมูลเป็นศูนย์ในการติดตั้งครั้งแรก

ฉันได้เปิดตัวแอป (เวลาโลก) พร้อมฐานข้อมูลเริ่มต้นแล้ว ตอนนี้ฉันต้องการอัปเดตแอปด้วยการอัปเกรดฐานข้อมูล

ฉันได้ใส่โค้ดอัปเกรดใน OnUpgrade() แล้วตรวจสอบเวอร์ชันใหม่ แต่มันไม่ได้ถูกเรียกในการทดสอบในพื้นที่ของฉัน ...

ดังนั้นฉันจึงใส่คำสั่ง debug เพื่อรับเวอร์ชันฐานข้อมูลและเป็นศูนย์

มีความคิดใดบ้างว่าทำไมมันถึงไม่มีเวอร์ชัน?

ต่อไปนี้เป็นรหัสเพื่อคัดลอกฐานข้อมูลจากโฟลเดอร์ Assets ของฉัน ...

    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

ต่อไปนี้คือตัวสร้างของฉัน OnCreate() & OnUpgrade()

public DatabaseHelper(Context context) {

    super(context, DB_NAME, null, DB_VERSION);
    this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if(oldVersion == 1 && newVersion == 2){
        String sql = "update statement...."; // i have a correct update statement here
        db.execSQL(sql);
    }

}

--
มาเฮช
http://android.maheshdixit.com


person mahesh    schedule 06.06.2010    source แหล่งที่มา
comment
เมื่อทำการตรวจสอบการอ่านของคุณสำหรับ -1 ไม่ใช่ 0   -  person Romain Hippeau    schedule 06.06.2010
comment
คุณต้องแสดงการใช้งาน SQLiteOpenHelper ของ onCreate() และ onUpgrade() ของคุณ หากคุณคาดว่าจะได้รับความช่วยเหลือเกี่ยวกับการใช้งาน onCreate() และ onUpgrade() ของ SQLiteOpenHelper   -  person CommonsWare    schedule 06.06.2010
comment
@แทนที่ โมฆะสาธารณะ onCreate(SQLiteDatabase db) { } @แทนที่ โมฆะสาธารณะ onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion == 1 && newVersion == 2){ String sql = คำสั่ง sql บางอัน...; db.execSQL(sql); } } DatabaseHelper สาธารณะ (บริบทบริบท) { super (บริบท, DB_NAME, null, DB_VERSION); this.myContext = บริบท; }   -  person mahesh    schedule 06.06.2010


คำตอบ (3)


คุณไม่ควรต้องตรวจสอบเวอร์ชันของ DB ด้วยตนเอง เนื่องจาก SQLite จะทำสิ่งนี้ให้คุณหากทำอย่างถูกต้อง

ในคลาสที่สืบทอดมาของ SQLiteOpenHelper ในตัวสร้าง คุณควรส่งผ่าน DB_VERSION บางอย่างเช่นนี้:

public class DBHelper extends SQLiteOpenHelper {
    public static final String DB_NAME = "your_db_name";
    public static final int DB_VERSION = 2;

    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
                ...
        }
  ...
}

จากนั้นใน onCreate() ของคุณรันตารางการสร้างและ onUpgrade() ทำทุกสิ่งที่คุณต้องทำเพื่ออัพเกรดโดยไม่ต้องตรวจสอบเวอร์ชัน วิธีการนี้จะถูกเรียกเมื่อ SQLite ตรวจสอบสิ่งนี้ให้คุณแล้วเท่านั้น หากคุณต้องการรันโค้ดใน onUpgrade() เพียงเพิ่มตัวแปร DB_VERSION ของคุณ

person Ricardo Villamil    schedule 07.06.2010

คุณควรมีคลาสที่เป็นอะแดปเตอร์ฐานข้อมูลของคุณ มันจะมีเส้นคล้ายดังต่อไปนี้:

private static final String  DATABASE_NAME = "sr4.db";
private static final int    DATABASE_VERSION = 1;

สิ่งที่คุณต้องทำเพื่อให้แอปรับรู้ว่าฐานข้อมูลจำเป็นต้องอัปเดตคือเปลี่ยนหมายเลข DATABASE_VERSION ที่ตั้งไว้

person David    schedule 06.06.2010
comment
ขอบคุณสำหรับการตอบกลับของคุณ... แต่ฉันมีสตริงสุดท้ายแบบคงที่ส่วนตัวต่อไปนี้แล้ว DB_NAME = WorldClock; int สุดท้ายคงที่ส่วนตัว DB_VERSION = 2; DatabaseHelper สาธารณะ (บริบทบริบท) { super (บริบท, DB_NAME, null, DB_VERSION); this.myContext = บริบท; } ฉันได้ลองตั้งค่าเวอร์ชันเป็น 1 อย่างชัดเจน แต่ในครั้งต่อไปที่มีการอัพเกรด จะไม่เรียก OnUpgrade() - person mahesh; 06.06.2010

ฉันพบปัญหา... ดูเหมือนว่า OnCreate() และ OnUpgrade จะถูกเรียกเฉพาะเมื่อคุณเรียก getReadableDatabases หรือ getWriteableDatabases() และฉันไม่ได้โทรหาทั้งสองคนหากมีฐานข้อมูลอยู่ ฉันถูกเรียกแทน SQLiteDatabase.openDatabase() ซึ่งไม่ได้เรียก OnCreate หรือ OnUpgrade()

ตอนนี้ฉันเรียก getWriteableDatabases() อย่างชัดเจนแล้ว จะเรียก OnUpgrade()

ขอบคุณสำหรับทุกคำตอบครับ แต่...

person mahesh    schedule 20.06.2010