2011-09-05 59 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

如果某人不想删除该表,该怎么办?表中有数据存储在它吗? –

相关问题