【问题标题】:android.database.sqlite.SQLiteException : Can't upgrade read-only database from version 0 to 1android.database.sqlite.SQLiteException:无法将只读数据库从版本 0 升级到 1
【发布时间】:2016-04-27 23:20:35
【问题描述】:

我正在获取安卓:android.database.sqlite.SQLiteException

无法将只读数据库从版本 0 升级到 1:/data/data/com.tuto.ListViewApp2_SQLite/databases/countryDB

当我运行模拟器时它没有启动,它说“不幸的是 appName 已停止”所以任何人都可以帮助我吗?

这是我的 MainActivity 类:

package com.tuto.ListViewApp2_SQLite;

import com.tuto.ListViewApp2_SQLite.R;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends Activity {

    private CountryDB countryDatabase = null;
    private Cursor countries = null;
    private ListView lvCountries = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Create the database helper
        CursorFactory factory = null;
        countryDatabase = new CountryDB(this, "countryDB", factory);

        String[] columnNames = {"Name", "Pop", "Area", BaseColumns._ID};
        lvCountries = (ListView) findViewById(R.id.lvCountries);

        int[] targetLayoutIDs = {R.id.textName, R.id.textPop, R.id.textArea};

        SQLiteDatabase db = countryDatabase.getReadableDatabase();
        countries = db.query("countries", columnNames, null, null, null, null, null);
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.country_item, 
                countries, columnNames, targetLayoutIDs, 0);    
        lvCountries.setAdapter(adapter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        countryDatabase.close();
    }
}

这是我的 SQLiteOpenHelper 子类:

package com.tuto.ListViewApp2_SQLite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class CountryDB extends SQLiteOpenHelper {

    private static final int DB_VERSION = 1;
    private static final String COUNTRY_TABLE_NAME = "countries";

    public CountryDB(Context context, String name, CursorFactory factory) {
        super(context, name, factory, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase dbCountries) {
        createTable(dbCountries);
    }

    @Override
    public void onUpgrade(SQLiteDatabase dbCountries, int oldVersion, int newVersion) {
        String dropSQL = "DROP TABLE IF EXISTS " + COUNTRY_TABLE_NAME +";";
        dbCountries.execSQL(dropSQL);
        createTable(dbCountries);
    }

    private void createTable(SQLiteDatabase dbCountries){
        String createSQL = "CREATE TABLE "+COUNTRY_TABLE_NAME+" ("+
                "_id INTEGER PRIMARY KEY AUTOINCREMENT, "+
                "Name TEXT, "+
                "Pop TEXT, "+
                "Area TEXT);";
        dbCountries.execSQL(createSQL);

        String insertSQL = "INSERT INTO " + COUNTRY_TABLE_NAME +
                " (Name, Pop, Area) " +
                "SELECT 'South Korea' AS NAME, '41,769,726' AS Pop, '1,068,296' AS Area"+
                " UNION SELECT 'Australia', '21,766,711', '2,967,893'" +
                " UNION SELECT 'India' , '1,189,172,906', '1,269,338',+" +
                " UNION SELECT 'United States', '313,232,044', '3,718,691';";
        dbCountries.execSQL(insertSQL);

    }
}

【问题讨论】:

  • 这是我的 SQLiteOpenHelper 子类:

标签: android sqlite


【解决方案1】:

您的insertSQL 没有被执行并失败。这就是为什么您的数据库没有升级的原因。插入查询在倒数第二个语句中有一个逗号和一个加号,这使查询无效。

试试这个-

 String insertSQL = "INSERT INTO " + COUNTRY_TABLE_NAME +
                " (Name, Pop, Area) " +
                "SELECT 'South Korea' AS NAME, '41,769,726' AS Pop, '1,068,296' AS Area"+
                " UNION SELECT 'Australia', '21,766,711', '2,967,893'" +
                " UNION SELECT 'India' , '1,189,172,906', '1,269,338'" +
                " UNION SELECT 'United States', '313,232,044', '3,718,691';";

【讨论】:

    【解决方案2】:

    您的文件系统上已经有一个只读数据库。它的版本是 0。您正在尝试将其升级到版本 1。问题是它是只读的,因此您无法更改它。最简单的解决方案是卸载并重新安装该应用程序,以摆脱旧的。或者检查旧数据库是否存在并先将其删除。其中任何一个都会丢失其中的数据,但根据您的 onUpgrade 代码,无论如何您都可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2011-03-26
      • 2014-08-13
      相关资源
      最近更新 更多