2011-09-05 58 views
2

在我的數據庫的第一個版本中,我有三行。以下方法在延伸SQLiteOpenHelper的類中。SQLiteException:無法將只讀數據庫從版本1升級到2

@Override 
public void onCreate(SQLiteDatabase database) { 
    database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL);"); 
} 

現在,我已經改變了版本號從1到2,並增加了一個新行:

@Override 
public void onCreate(SQLiteDatabase database) { 
    database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL, country TEXT);"); 
} 

我不在乎舊數據庫丟失,所以我就用這個升級:

@Override 
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
    db.delete(DATABASENAME, null, null); 
    onCreate(db); 
} 

現在,當我調用該方法getReadableDatabase(),應用程序崩潰,與logcat的錯誤

產生的原因:android.database.sqlite.SQLiteException:無法從版本1升級 只讀數據庫,以2: /data/data/com.myapp.app/databases/mydb

我怎樣才能防止這一點?

編輯

滿級:

public class StationsOpenHelper extends SQLiteOpenHelper { 

    private static final String DATABASENAME = "stations"; 
    private static final int DATABASEVERSION = 2; 

    public StationsOpenHelper(Context context) { 
     super(context, DATABASENAME, null, DATABASEVERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database) { 
     database.execSQL("CREATE TABLE " + DATABASENAME + " (name TEXT, latitude REAL, longitude REAL, country TEXT);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
     db.delete(DATABASENAME, null, null); 
     onCreate(db); 
    } 

    public ArrayList<Station> getStations() { 
     Logger.log("Trying to read stations from database"); 
     ArrayList<Station> result = new ArrayList<Station>(); 

     SQLiteDatabase database = getReadableDatabase(); 
     Cursor cursor = database.rawQuery("SELECT * FROM " + DATABASENAME, null); 

     String name, country; 
     double lat, lon; 
     Station s; 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      s = new Station(); 
      name = cursor.getString(0); 
      lat = cursor.getDouble(1); 
      lon = cursor.getDouble(2); 
      country = cursor.getString(3); 

      s.setName(name); 
      s.setLatitude(lat); 
      s.setLongitude(lon); 
      s.setCountry(country); 

      result.add(s); 

      cursor.moveToNext(); 
     } 
     cursor.close(); 
     database.close(); 

     if (result.isEmpty()) { 
      Logger.log("Reading stations from database failed"); 
      result = null; 
     } else { 
      Logger.log("Reading stations from database succeeded"); 
     } 

     return result; 
    } 

    public void storeStations(ArrayList<Station> stations) { 
     Logger.log("Storing stations in database"); 
     ContentValues values = new ContentValues(); 
     SQLiteDatabase db = getWritableDatabase(); 
     db.delete(DATABASENAME, null, null); 

     for (int i = 0; i < stations.size(); i++) { 
      values.put("name", stations.get(i).getName()); 
      values.put("latitude", stations.get(i).getLatitude()); 
      values.put("longitude", stations.get(i).getLongitude()); 
      values.put("country", stations.get(i).getCountry()); 
      db.insert(DATABASENAME, null, values); 
     } 

     db.close(); 
     Logger.log("Storing stations in database succeeded"); 
    } 
} 

回答

13

好吧,這裏是我提出的解決方案,以取代db.delete:

db.execSQL("DROP TABLE IF EXISTS " + DATABASENAME); 

我有一種奇怪的感覺,會工作;)

+1

哇,那實際上工作!你必須是通靈的或者其他的東西! – nhaarman

+2

一隻小鳥告訴我! –

+0

如果某人不想刪除該表,該怎麼辦?表中有數據存儲在它嗎? –

相關問題