0

我遵循了有关如何使用 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;
    }
}
4

3 回答 3

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);
}
于 2012-03-17T09:57:54.003 回答
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观察:你不应该在or方法中调用getWritableDatabase()or 。其实你甚至不需要。将此方法重写为:getReadableDatabase()onCreateonUpgrade

@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对象,就像您在上面的几行中所做的一样。

于 2012-03-17T09:40:55.857 回答
0

你得到错误是因为你写的

c.moveToFirst(); 

不检查是否c有行..

无论如何.. c没有行导致您没有正确添加行..

只需像“Taras Feschuk”的答案中提到的那样正确添加值。

每当你写c.moveToFirst()..first 检查if(c.getCount()>0)

于 2012-03-17T10:08:40.170 回答