0

レコードを挿入すると、次の問題に直面し java.lang.runtimeexception unable to start activity componentinfo java.lang.nullpointerexceptionます。 .sqlite データベースに値を挿入しているときに、null ポインター例外が発生します。ブレークポイントを設定して値をチェックしようとすると、dh inDatabaseHelper dh = new DatabaseHelper(this)が null になります。以下は、私の DatabaseHelper クラスのコードと、値を挿入しようとしているクラスです。

最初のアクティビティ: DbActivity.java

package com.example.dbhelpersimple;

import android.os.Bundle;
import android.provider.Contacts;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.support.v4.app.NavUtils;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;

public class DbActivity extends SQLiteOpenHelper {

    public static final String COL_NAME = "name";
    public static final String COL_CNT = "contact";
    private static final String DATABASE_TABLE = "test";
    private static String DATABASE_NAME = "PERSONS.db";

    private static final String DATABASE_CREATE="CREATE TABLE test"+
            "(name VARCHAR(10), contact VARCHAR(10));";





    SQLiteDatabase db;





    public DbActivity(Context context) {
        super(context, DATABASE_NAME, null, 1);
        // TODO Auto-generated constructor stub
    }









    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

        db.execSQL(DATABASE_NAME);
        onCreate(db);
    }

    void addrecord(String name, String contact)
    {
        ContentValues cv=new ContentValues();
        cv.put(COL_NAME, name);
        cv.put(COL_CNT, contact);
        db.insert(DATABASE_TABLE, null, cv);
        db.close();
    }


    void getrecords()
    {
        int i;
        //String query="SELECT * FROM test";
        Cursor c=db.query(DATABASE_TABLE, null, null, null, null, null, null);
        c.moveToFirst();

        while(c.isAfterLast()==false)
        {
            Log.d("Name", c.getString(0));
            Log.d("Contact", c.getString(1));
        }



    }


}

2 番目のアクティビティ: manageActivity.java

package com.example.dbhelpersimple;

import android.app.Activity;

import android.os.Bundle;

import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import android.widget.SimpleAdapter;


public class manipulateActivity extends Activity{

    Button btn1,btn2,btn3;

      EditText edt1,edt2;


     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_db);

            edt1=(EditText)findViewById(R.id.edittextname);
            edt2=(EditText)findViewById(R.id.edittextcontact);

    DbActivity dbact= new DbActivity(this);

    dbact.addrecord("sagar", "111");




     }

}
4

4 に答える 4

1

最初のアクティビティ: DbActivity.java

private final Context context;

public DbActivity(Context context)
    {

    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context = context;

    }
private static final String DATABASE_CREATE =
               "create table test (_id integer primary key autoincrement, "
               + "name text Not Null, contact text Not Null);";

@Override
public void onCreate(SQLiteDatabase database) {
    database.execSQL(DATABASE_CREATE);


}

2 番目のアクティビティ: ManipulateActivity.java

private DbActivity dbHelper;

private Context context;

public ManipulateActivity(Context context) {
    this.context = context;
}

 dbHelper = new DbActivity(context);
于 2012-08-07T08:22:02.250 に答える
0

そのコードには非常に多くのナンセンスがあります。しかし、次々と:

SQLite にはVARCHAR. このタイプは、ドキュメントTEXTで概説されているタイプに自動的に変換されます。

VARCHAR 型には文字列 "CHAR" が含まれているため、TEXT アフィニティが割り当てられていることに注意してください。


DatabaseHelper-class onUpgrade()-method には、次のコードがあります。

db.execSQL(DATABASE_NAME);

-constantDATABASE_NAMEはデータベース ファイルの名前にすぎない (したがって、有効な SQL クエリではない) ため、これは失敗します。


あなたのaddrecord()-method では、SQLiteDatabase初期化されていない -object を使用しています。これが、NPE を取得する理由です。

から読み取り/書き込み可能なデータベースを取得するには、 - および -メソッドSQLiteOpenHelperを使用します。getReadableDatabase()getWritableDatabase()

アクティビティの開始時にこの問題が発生する理由は、onCreate()アクティビティの作成時に呼び出されるアクティビティ メソッドでこのメソッドを使用しているためです。


addrecord()-methodの実用的な実装は次のようになります。

public void addrecord(String name, String contact){
    ContentValues cv=new ContentValues();
    cv.put(COL_NAME, name);
    cv.put(COL_CNT, contact);
    SQLiteDatabase db = this.getWritableDatabase();
    db.insert(DATABASE_TABLE, null, cv);
    db.close();
}
于 2012-08-07T08:20:10.337 に答える
0

以下のように DbActivity クラスのコンストラクターを変更します。

     public DbActivity(Context context) {
    super(context, DATABASE_NAME, null, 1);
    // TODO Auto-generated constructor stub
       this.myContext = context;   // myContext is your context in DbActivity class
  }

コンテキストを取得していないため、null ポインター例外が発生していると思います。これが役立つことを願っています:)

于 2012-08-07T08:10:04.970 に答える
0

次のコードを試してください。database_create ステートメントに問題があると思います。

private static final String DATABASE_CREATE =
                   "create table test (_id integer primary key autoincrement, "
                   + "name text Not Null, contact text Not Null);";
于 2012-08-07T08:11:59.947 に答える