SQLiteException:无法从版本1升级只读数据库2 [英] SQLiteException: Can't upgrade read-only database from version 1 to 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屋!