SQLiteOpenHelper崩溃了Android应用程序

时间:2012-03-17 09:35:56

标签: android sqliteopenhelper

我遵循了如何使用android SDK处理SQLite数据库的教程。我的问题是当我调用方法“getUsername()”时应用程序崩溃。我做错了什么?

package racenet.racenet;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class Preferences extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2;
    private static final String DATABASE_NAME = "racenet.racenet.db";

    Preferences(Context context) {

        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE settings(key TEXT, value TEXT)");

        values = new ContentValues();
        values.put("user_name", "");
        getWritableDatabase().insert("settings", null, values);
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {

    }

    public String getUsername() {

        Cursor c = getReadableDatabase().query("settings", new String[]{"value"},
            "key = 'user_name'", null, null, null, null);
        c.moveToFirst();
        String username = c.getString(0);
        c.close();
        return username;
    }
}

3 个答案:

答案 0 :(得分:3)

嗨,试试这个:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE settings (key TEXT, value TEXT);");

    values = new ContentValues();

    // First argument of the put method is a column name
    // Second argument is an inserted value
    values.put("key", "user_name");
    values.put("value", "user_value");

    db.insert("settings", null, values);
}

// This method will drop your table and create a new one if you have changed 
// the database version
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS settings");

    onCreate(db);
}

答案 1 :(得分:1)

确保崩溃应用程序的一件事是您不关闭在方法中使用的数据库对象。你需要像这样重写它:

public String getUsername() {
    SQLiteDatabase database = getReadableDatabase();
    Cursor c = getReadableDatabase().query("settings", new String[]{"value"},
        "key = 'user_name'", null, null, null, null);
    c.moveToFirst();
    String username = c.getString(0);
    c.close();
    database.close();
    return username;
}

编辑使用@slukian观察结果扩展我的答案更加完整:您不应该从getWritableDatabase()或{{getReadableDatabase()内拨打onCreateonUpgrade 1}}方法。实际上你甚至不需要。将此方法重写为:

@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL("CREATE TABLE settings(key TEXT, value TEXT)");
    values = new ContentValues();
    values.put("user_name", "");
    db.insert("settings", null, values);
}

请注意,我只是使用传入的db对象,就像你上面的几行一样。

答案 2 :(得分:0)

你因为写了

而收到错误
c.moveToFirst(); 

不检查c是否有行..

反正.. c没有行导致你没有正确添加行..

只需正确添加值,如“Taras Feschuk”的回答中提到的那样。

每当你写c.moveToFirst()时..先查看if(c.getCount()>0)