2012-03-17 11 views
0

アンドロイドSDKを使用してSQLiteデータベースを処理する方法に関するチュートリアルに続きました。私の問題は、 "getUsername()"メソッドを呼び出すとアプリケーションがクラッシュすることです。私は間違って何をしていますか?SQLiteOpenHelperがAndroidアプリケーションをクラッシュする

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

を書くたびにエラーをアップロードしてください。 – Lucifer

答えて

3

こんにちは、これを試してください:あなたはc行を持っているかどうか確認せずに

c.moveToFirst(); 

を書かれたので、あなたがとにかく..

をエラーを取得し

@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); 
} 
+0

+1良い答え..... – MKJParekh

+0

もコードスニペットでいくつかの説明を追加します。それはもっと助けることができます:) – MKJParekh

+0

私はまた、クラスのプライベート変数にテーブル名とカラム名を格納することを提案することができます。将来のデータベース変更を行い、select/update/delete/insertロジックを記述するためのより柔軟な方法を作成します。 –

1

アプリケーションを確実にクラッシュさせる1つの方法は、メソッドで使用するデータベースオブジェクトを閉じないことです。あなたはそのようにそれを書き換える必要があります。@slukian観測を使用して、より完全であることを私の答えを拡張

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; 
} 

EDIT:あなたはonCreateonUpgradeメソッド内からgetWritableDatabase()またはgetReadableDatabase()を呼び出すべきではありません。実際にあなたはする必要はありません。私はちょうどあなたが上記の複数の行を行ったように、渡されたdbオブジェクトを使用していますことを

@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); 
} 

注:このメソッドを書き換えます。

+0

これは役に立たなかった... –

+0

問題を整理する際にエラーログを追加する必要があります。この情報がなくてもわかるように、あなたのプログラムには2つのバグが見つかりました(@slukianのコメントのために編集しましたか?) –

0

.. C doesntの行を持っています行を正しく追加しないためです。

ちょうど正確に値を追加"タラスFeschuk"の答えで述べたような。

、あなたがc.moveToFirst() ..firstチェックif(c.getCount()>0)

関連する問題