SQLiteException:无法从版本1升级只读数据库2 [英] SQLiteException: Can't upgrade read-only database from version 1 to 2

查看:130
本文介绍了SQLiteException:无法从版本1升级只读数据库2的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的数据库的第一个版本,我有三排。下面的方法是在扩展 SQLiteOpenHelper

一类

  @覆盖
公共无效的onCreate(SQLiteDatabase数据库){
    database.execSQL(CREATE TABLE+ DATABASENAME +(Name文本,纬度REAL,经度REAL););
}
 

现在,我已经改变了版本号从1到2,并增加了一个新行:

  @覆盖
公共无效的onCreate(SQLiteDatabase数据库){
    database.execSQL(CREATE TABLE+ DATABASENAME +(Name文本,纬度REAL,经度REAL,国家TEXT););
}
 

我不在乎旧数据库丢失,所以我用这个上升级:

  @覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT ARG1,ARG2 INT){
    db.delete(DATABASENAME,NULL,NULL);
    的onCreate(DB);
}
 

现在,当我调用该方法 getReadableDatabase(),应用程序崩溃,与logcat的误差

  

产生的原因:android.database.sqlite.SQLiteException:无法升级   只读从版本1数据库到2:   /data/data/com.myapp.app/databases/mydb

我怎样才能prevent呢?

修改

满级:

 公共类StationsOpenHelper扩展SQLiteOpenHelper {

    私有静态最后弦乐DATABASENAME =站;
    私有静态最终诠释DATABASEVERSION = 2;

    公共StationsOpenHelper(上下文的背景下){
        超(背景下,DATABASENAME,空,DATABASEVERSION);
    }

    @覆盖
    公共无效的onCreate(SQLiteDatabase数据库){
        database.execSQL(CREATE TABLE+ DATABASENAME +(Name文本,纬度REAL,经度REAL,国家TEXT););
    }

    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT ARG1,ARG2 INT){
        db.delete(DATABASENAME,NULL,NULL);
        的onCreate(DB);
    }

    公众的ArrayList<站> getStations(){
        Logger.log(试图读取数据库站);
        ArrayList的<站>结果=新的ArrayList<站>();

        SQLiteDatabase数据库= getReadableDatabase();
        光标光标= database.rawQuery(SELECT * FROM+ DATABASENAME,NULL);

        字符串名称,国家;
        双纬度,经度;
        站S;
        cursor.moveToFirst();
        而(!cursor.isAfterLast()){
            S =新站();
            名= cursor.getString(0);
            纬度= cursor.getDouble(1);
            经度= cursor.getDouble(2);
            国家= cursor.getString(3);

            s.setName(名称);
            s.setLatitude(LAT);
            s.setLongitude(LON);
            s.setCountry(国家);

            result.add(多个);

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

        如果(result.isEmpty()){
            Logger.log(从数据库中读取站失败);
            结果= NULL;
        } 其他 {
            Logger.log(从数据库中读取站成功);
        }

        返回结果;
    }

    公共无效storeStations(ArrayList中<站>站){
        Logger.log(存储在数据库站);
        ContentValues​​值=新ContentValues​​();
        SQLiteDatabase DB = getWritableDatabase();
        db.delete(DATABASENAME,NULL,NULL);

        的for(int i = 0; I< stations.size();我++){
            values​​.put(姓名,stations.get(ⅰ).getName());
            values​​.put(纬度,stations.get(ⅰ).getLatitude());
            values​​.put(经度,stations.get(ⅰ).getLongitude());
            values​​.put(国家,stations.get(我).getCountry());
            db.insert(DATABASENAME,空,价值观);
        }

        db.close();
        Logger.log(在数据库中存储站成功);
    }
}
 

解决方案

好吧,这里的解决方案,我建议,替换db.delete:

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

我有一种奇怪的感觉,将工作;)

In the first version of my database I had three rows. The following methods are in a class that extends SQLiteOpenHelper.

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

Now, I have changed the version number from 1 to 2, and added a new row:

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

I don't care that the old database is lost, so I use this on upgrade:

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

Now when I call the method getReadableDatabase(), the app crashes, with the logcat error

Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 1 to 2: /data/data/com.myapp.app/databases/mydb

How can I prevent this?

EDIT

The full class:

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

解决方案

Ok, here's the solution I propose, replace db.delete with:

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

I have a strange feeling that will work ;)

这篇关于SQLiteException:无法从版本1升级只读数据库2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆