SQLiteException: невозможно обновить базу данных только для чтения с версии 1 до 2 - PullRequest
2 голосов
/ 06 сентября 2011

В первой версии моей базы данных у меня было три строки.Следующие методы находятся в классе, который расширяет SQLiteOpenHelper.

@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");
    }
}

1 Ответ

13 голосов
/ 07 сентября 2011

Хорошо, вот решение, которое я предлагаю, замените db.delete на:

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

У меня странное чувство, что это сработает;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...