0

ListView アイテムを長押しして、SQLite の ADD および DELETE 関数を使用して単純な APP を作成します。しかし、DELETE を実行するとエラーが発生します。

Logcat(解決済み)

04-17 21:19:42.433: E/AndroidRuntime(4067): FATAL EXCEPTION: main
04-17 21:19:42.433: E/AndroidRuntime(4067): java.lang.NullPointerException
04-17 21:19:42.433: E/AndroidRuntime(4067):     at tw.danny.idcc_hw2.savedHeadlinesFragment$1.onItemLongClick(savedHeadlinesFragment.java:91)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at android.widget.AbsListView.performLongPress(AbsListView.java:2921)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:2871)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at android.os.Handler.handleCallback(Handler.java:615)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at android.os.Looper.loop(Looper.java:137)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at android.app.ActivityThread.main(ActivityThread.java:4745)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at java.lang.reflect.Method.invokeNative(Native Method)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at java.lang.reflect.Method.invoke(Method.java:511)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-17 21:19:42.433: E/AndroidRuntime(4067):     at dalvik.system.NativeStart.main(Native Method)

私のAPPは、ListViewフラグメントを使用してデータ(タイトル)を表示し、longClickアイテムを使用してデータベースに追加することです。activity2 では、データベース内のすべてのデータ (タイトル) を同じレイアウトで表示します。これからは、すべての機能が正常に動作します。アクティビティ1のADDと同じ操作でアクティビティ2にDELETEを実装したいときに問題が発生しました。

onItemLongClick リスナー (DELETE の場合は activity2)

@Override
public void onActivityCreated(Bundle savedState) {
    super.onActivityCreated(savedState);

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int position, long arg3) {

            //Long press to delete article from db
            int rnumber =  dbHlp.DELETEColumData(RSSData.Headlines.get(position));

            if(rnumber==1)
                Toast.makeText(getActivity(), "Deleted.", Toast.LENGTH_LONG).show();
            else if(rnumber==0)
                Toast.makeText(getActivity(), "Delete Error!", Toast.LENGTH_LONG).show();

            return true;
        }
    });
}

onItemLongClick リスナー (ADD の場合は activity1)

@Override
public void onActivityCreated(Bundle savedState) {
    super.onActivityCreated(savedState);

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int position, long arg3) {
            //Long press to add article to db
            long rowID =  dbHlp.ADDColumData(RSSData.Headlines.get(position), RSSData.Articles.get(position));


            Toast.makeText(getActivity(), "Add to list. id:"+rowID, Toast.LENGTH_LONG).show();

            return true;
        }
    });
}

SQLiteOpenHelper の関数

public class RSSDBHlp extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "ReadLater";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "article";
private static final String TABLE_CREATE = 
                "CREATE TABLE " + TABLE_NAME + " ( " +
                " id integer primary key autoincrement, " +
                " title TEXT NOT NULL, " +
                " detail TEXT );";

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

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(TABLE_CREATE);
}

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


public long ADDColumData(String Title,String Detail) {
    SQLiteDatabase db = getWritableDatabase();      
    ContentValues values =new ContentValues();
    values.put("title", Title);
    values.put("detail", Detail);
    long rowID =db.insert(TABLE_NAME, null, values);

    db.close();
    return rowID;
}

public int DELETEColumData(String Title) {
    SQLiteDatabase db = getWritableDatabase();
    Log.d("MSG","DELETE:"+Title);
    String whereClause = "title='" + Title + "'";
    int rnumber = db.delete(TABLE_NAME, whereClause, null);

    //0:error 1:all row delete

    db.close();
    return rnumber;
}

それの何が問題なのか、うまく機能するADD関数のコードをコピーして変更するだけです。

削除する

 Returns
the number of rows affected if a whereClause is passed in, 0 otherwise. To remove all rows and get a count pass "1" as the whereClause.
4

2 に答える 2

0

デバッグのように見えますが、コードを動作させずに見ることは、デバッガーを目の前に置くことに比べて簡単ではない場合があります。

私の最善の推測は、dbHlp 変数が初期化されていることを 100% 確信していると仮定すると、RSSData.Headlines または RSSData が null であるということです。私はこの方向でデバッグを開始しますが、提供された情報で 100% 有用な回答を得ることは困難です。

よろしく

于 2013-04-17T13:59:26.513 に答える
0

NullPointerException

変数を初期化していませんdbHlp。だからその投げNullPointerExceptionます。

dbHlp初めて使用する前に初期化してください。つまり、

dbHlp = new RSSDBHlp();

sqllite から行を削除して 0 を返す

ステートメントを変更する

String whereClause = "title='" + Title + "'";
int rnumber = db.delete(TABLE_NAME, whereClause, null);

以下のように

int rnumber = db.delete(TABLE_NAME, "title=?", new String[] {Title});
于 2013-04-17T13:38:50.947 に答える