1

データベースにレコードを追加する、プログラムのエラー

ログ

04-02 09:22:08.601: W/dalvikvm(4332): threadid=1: thread exiting with uncaught  exception (group=0x40018578)
    04-02 09:22:10.023: E/AndroidRuntime(4332): FATAL EXCEPTION: main
    04-02 09:22:10.023: E/AndroidRuntime(4332): java.lang.NullPointerException
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at com.example.ok1.MySqlCursorAdapter.onClick(MySqlCursorAdapter.java:87)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at android.view.View.performClick(View.java:2485)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at android.widget.CompoundButton.performClick(CompoundButton.java:99)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at android.view.View$PerformClick.run(View.java:9080)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at android.os.Handler.handleCallback(Handler.java:587)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at     android.os.Handler.dispatchMessage(Handler.java:92)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at android.os.Looper.loop(Looper.java:130)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at android.app.ActivityThread.main(ActivityThread.java:3687)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at java.lang.reflect.Method.invokeNative(Native Method)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at java.lang.reflect.Method.invoke(Method.java:507)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    04-02 09:22:10.023: E/AndroidRuntime(4332):     at dalvik.system.NativeStart.main(Native Method)

MySqlCursorAdapter

   package com.example.ok1;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class MySqlCursorAdapter extends SimpleCursorAdapter implements
        OnClickListener {
    final String Tag = "States";
    private Context context;
    private DBHelper dbHelper;
    private Cursor currentCursor;

    public MySqlCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to, DBHelper dbHelper) {
        super(context, layout, c, from, to);
        Log.d(Tag, "трассировка1");
        this.currentCursor = c;
        this.context = context;
        this.dbHelper = dbHelper;
        Log.d(Tag, "MySqlCursorAdapter()");
        Integer b = c.getCount();
        Log.d(Tag, "b=" + b);
    }

    public View getView(int pos, View inView, ViewGroup parent) {
        Log.d(Tag, "getView() + posss=" + pos);
        View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.my_list_item, null);
        }

        this.currentCursor.moveToPosition(pos);

        CheckBox cBox = (CheckBox) v.findViewById(R.id.bcheck);

        cBox.setTag(Integer.parseInt(this.currentCursor
                .getString(this.currentCursor
                        .getColumnIndex(DBHelper.COLUMN_ID))));
        Log.d(Tag, "tag=" + cBox.getTag().toString());
        if (this.currentCursor.getString(this.currentCursor
                .getColumnIndex(DBHelper.COLUMN_STATUS)) != null
                && Integer.parseInt(this.currentCursor
                        .getString(this.currentCursor
                                .getColumnIndex(DBHelper.COLUMN_STATUS))) != 0) {
            cBox.setChecked(true);
        } else {
            cBox.setChecked(false);
        }
        cBox.setOnClickListener(this);

        TextView txtTitle = (TextView) v.findViewById(R.id.txtTitle);
        txtTitle.setText(this.currentCursor.getString(this.currentCursor
                .getColumnIndex(DBHelper.COLUMN_NAME)));

        return (v);
    }

    public void ClearSelections() {
        Log.d(Tag, "ClearSelections()");
        this.dbHelper.clearSelections();
        this.currentCursor.requery();
    }

    @Override
    public void onClick(View v) {
        Log.d(Tag, "onClick");
        CheckBox cBox = (CheckBox) v;
        Integer _id = (Integer) cBox.getTag();
        Log.d(Tag, "Integer _id=" + _id.toString());
        ContentValues values = new ContentValues();
        values.put(" status", cBox.isChecked() ? 1 : 0);
        try {
            this.dbHelper.dbSqlite.update("mytable", values, "_id = ?",
                    new String[] { Integer.toString(_id) });
        } catch (SQLException sqle) {
            Log.d(Tag, "неудача");
            throw sqle;
        }
    }
}

エラーは行に表示されます

"this.dbHelper.dbSqlite.update("mytable", values, "_id = ?", new String[] {     Integer.toString(_id) });"`
4

4 に答える 4

1

dbSqliteDBhelperクラスで行ったことはありませんinitialized。を避けるようにしてください。NPE

このメソッドを DBhelper クラスに追加します

 private void open() throws SQLException {
      dbSqlite = this.getWritableDatabase();
   }

コンストラクターで呼び出します

public DBHelper(Context context) {
    super(context, "myDB", null, 1);
    open();
}

しかし、それが言っていることは、dbを処理する最良の方法ではありませんが、先に進むのに役立ちます

最善の方法は、DBHelper クラスに open() および close() メソッドを追加して、適切な状態で接続を管理できるようにすることです。

閉じる方法

 public void close() {
      this.close();
   }

open() メソッド

public void open() throws SQLException {
      dbSqlite = this.getWritableDatabase();
   }

onclick() の MySqlCursorAdapter クラスで

 try {
        DBhelper helper = new DBhelper(this);
        helper.open();
            helper.update("mytable", values, "_id = ?",
                    new String[] { Integer.toString(_id) });
        helper.close();
        } catch (SQLException sqle) {
            Log.d(Tag, "неудача");
            throw sqle;
        }
   }
于 2013-04-02T06:49:36.907 に答える
1

DBHelper クラスで dbsqlite が初期化されたかどうかを確認してください。

dbHelper.dbSqlite

この行を参照して、質問ですでに述べたように。dbSqlite が初期化されていない可能性があります。

if(dbHelper.dbSqlite==null)
    // init first then used
于 2013-04-02T05:57:23.297 に答える
0

DBHelper
パッケージ com.example.ok1;

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


public class DBHelper extends SQLiteOpenHelper {
final String Tag="States";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_DATA = "data_id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_STATUS = "status";
public static final String TABLE_NAME = "mytable";
public SQLiteDatabase dbSqlite;
public DBHelper(Context context) {
  // конструктор суперкласса
    super(context, "myDB", null, 1);
}



@Override
public void onCreate(SQLiteDatabase db) {
  Log.d(Tag, "--- onCreate database ---");
  // создаем таблицу с полями
  db.execSQL("create table mytable ("
      + "_id integer primary key autoincrement," 
      + "data_id text,"
      + "name text,"
      + "task text,"
      + "status integer"
       + ");");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

public void clearSelections() {
    Log.d(Tag, "clearSelections()");
    ContentValues values = new ContentValues();
    values.put(" selected", 0);
    this.dbSqlite.update(DBHelper.TABLE_NAME, values, null, null);
}

public Cursor getCursor() {
    Log.d(Tag, "getCursor() получили курсор с базы");
        String[] columns = null;
        String selection = null;
        String[] selectionArgs = null;
        String groupBy = null;
        String having = null;
        String orderBy = null;
//  SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

//  queryBuilder.setTables(TABLE_NAME);

//  String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_NAME,
//          COLUMN_DATA, COLUMN_STATUS };

//  Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null,
//          null, null, null, "title ASC");
//  Log.d(Tag, "getCursor() получили курсор с базы конец");
            final SQLiteDatabase db = this.getWritableDatabase();
            columns = new String[] { COLUMN_ID, COLUMN_NAME, COLUMN_STATUS };
//              selection = "data_id = ?";
//              selectionArgs = new String[] {id_for_listtsk_today};
            Cursor c = db.query("mytable", columns, null, null, null, null, null);
    return c;
}
}
于 2013-04-02T06:19:00.677 に答える
0

テーブルが作成されたかどうかを確認しましたか

db.execSQL("create table mytable (" + " _id integer primary key autoincrement, " + " data_id text, " + " name text, " + " task text, " + " status integer " + ");");

テーブルの作成にスペースを入れないでください..これを使用してください

于 2013-04-02T06:28:54.703 に答える