Android sqlite数据库错误

时间:2015-03-27 09:42:06

标签: android database sqlite

我正在尝试将数据库添加到我的应用中。 但是我无法运行它而没有错误。 我跟着这个article 这是我的代码。

首先我有设置类

public class Settings {

int _id;
int _update_interval;

public Settings(){

}

public Settings(int id,int update_interval){
    this._id = id;
    this._update_interval = update_interval;
}

public Settings(int update_interval){
    this._update_interval = update_interval;
}

public int getID(){
    return this._id;
}

public void setID(int id){
    this._id = id;
}

public Integer getUpdateInterval(){
    return this._update_interval;
}

public void setUpdateInterval(int update_interval){
    this._update_interval = update_interval;
}

之后是Handler

public class DatabaseHandler extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "app_data";
private static final String TABLE_SETTINGS = "settings";
private static final String KEY_ID = "id";
private static final String KEY_UPDATE_INTERVAL = "update_interval";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_SETTINGS_TABLE = "CREATE TABLE " + TABLE_SETTINGS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_UPDATE_INTERVAL + " INTEGER " + ")";
    db.execSQL(CREATE_SETTINGS_TABLE);

        ContentValues values = new ContentValues();
        values.put(KEY_ID, 1);
        values.put(KEY_UPDATE_INTERVAL, 60);

        db.insert(TABLE_SETTINGS, null, values);
        db.close();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTINGS);

    onCreate(db);
}

Settings getSettings(int id) {
    SQLiteDatabase dbа = this.getReadableDatabase();

    Cursor cursor = dbа.query(TABLE_SETTINGS, new String[] { KEY_ID,
                    KEY_UPDATE_INTERVAL }, KEY_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();

    Settings settings = new Settings(cursor.getInt(0),cursor.getInt(1));

    return settings;
}

void addSettings(Settings settings) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(KEY_ID, settings.getID());
    values.put(KEY_UPDATE_INTERVAL, settings.getUpdateInterval());

    db.insert(TABLE_SETTINGS, null, values);

    db.close();

}

我正在使用它

public class MainActivity extends Activity {

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

    DatabaseHandler db = new DatabaseHandler(this);

    Settings settings = db.getSettings(1);
}

}

然而,每次当我尝试使用处理程序中的函数时,我都会在SQLiteDatabase db = this.getWritableDatabase()之后收到错误; 错误本身是:尝试重新打开已经关闭的对象:SQLiteDatabase: 这告诉我对象已关闭,但我只是再次创建它? 我的代码与教程完全相同.. 如果它确实很重要,我会使用android studio。

2 个答案:

答案 0 :(得分:3)

删除db.close()中的onCreate()。您不拥有作为参数传递的数据库,您不应该关闭它。

答案 1 :(得分:0)

您需要删除对db.close()onCreate()

的任何使用

SQLiteOpenHelper拥有数据库对象,当Android关闭Helper时,它将为您关闭数据库,就像它为您打开数据库一样。

此外,你不应该在主线程中调用从数据库中获取内容(即getSettings()中的onCreate()),因为它使用getReadableDatabase()或{{1这些可能需要很长时间才能返回并导致ANR。 Android docs on getReabableDatabase()