0

androidSDKを使用して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

アプリケーションを確実にクラッシュさせる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

@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に行がないため、行が正しく追加されていません。

「TarasFeschuk」の回答に記載されているように、値を正しく追加するだけです。

そしてあなたが書くときはいつでもc.moveToFirst()..最初のチェックif(c.getCount()>0)

于 2012-03-17T10:08:40.170 に答える