0

特定の情報を格納するデータベースを使用するプロジェクトに取り組んでいます。データベースはプログラムの一部では機能しますが、他の部分では機能しません。ユーザーが最初にプログラムを起動すると、データベースから取得された情報が表示され、新しい情報を追加するオプションもあります。データベースはこれらの両方で正常に機能します。

私が問題を抱えているのは、情報を追加する別の場所です。データベースを開こうとすると、プログラムがクラッシュします。ログキャット:

08-29 20:22:47.000: E/AndroidRuntime(3022): FATAL EXCEPTION: main
08-29 20:22:47.000: E/AndroidRuntime(3022): java.lang.NullPointerException
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.database.sqlite.SQLiteOpenHelper._getWritableDatabase(SQLiteOpenHelper.java:164)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:100)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at peices.DbM.open(DbM.java:173)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at peices.NewStuff.CreateNewUnit(NewStuff.java:27)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at carlson.msum.arch.Site$5.onClick(Site.java:231)
08-29 20:22:47.000: E/AndroidRuntime(3022):     at android.view.View.performClick(View.java:2538)

NewStuff:27 のコード (20 ~ 30 行目):

bb=Lon.getText().toString();
            cc=UnitName.getText().toString();
            Log.d("Class",aa);
            Log.d("Class",bb);
            Log.d("Class",cc);
            Log.d("Class",SiteName);
            Log.d("Stuff","Before Open");
            **db.open();**
            Log.d("Stuff","Before Insert/After Open");
            db.InsertUnit(SiteName, cc, aa, bb);
            Log.d("Stuff","Before Close/After Insert");
            db.close();

DbM.java:173(170-176) のコード

public DbM open() throws SQLException
{
    Log.d("BmDb","open");
    **db= DbMh.getWritableDatabase();**
    Log.d("BmDb","Open before return");
    return this;
}

私はそれがデータベースのオープンに関係していることをすでに知っていますが、なぜそれを開いて他の活動のために働くのですか? これより前のすべてのアクティビティをチェックアウトし、すべてのデータベースを閉じました。

これがクラスの始まりです。DbM の初期化は、他のすべてのクラスで行う方法です。

public class NewStuff extends Activity {
Context context;
**DbM db=new DbM(this);**

可能性のあることの 1 つですが、修正方法がわからないのは、これがプログラムの他の部分で使用しているオブジェクトのクラスであることです。したがって、私は oncreates などを呼び出していませんが、それが私の問題を引き起こしているのでしょうか?

*編集*

これは私の NewStuff クラス全体です。何も機能していないように見えるため、コンテキスト以外の何かが欠けているに違いありません。

package peices;
import peices.DbM;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.app.Activity;
import android.content.Context;

public class NewStuff extends Activity {
Context context;
DbM db;
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        db=new DbM(this);
        }
    public void CreateNewUnit(EditText Lat, EditText Lon, EditText UnitName, String SiteName)
    {

            db=new DbM(this);
            Log.d("NewUnit","Start of");
            String aa="";
            String bb="";
            String cc="";

            aa=Lat.getText().toString();
            bb=Lon.getText().toString();
            cc=UnitName.getText().toString();
            Log.d("Class",aa);
            Log.d("Class",bb);
            Log.d("Class",cc);
            Log.d("Class",SiteName);
            Log.d("Stuff","Before Open");
            db.open();
            Log.d("Stuff","Before Insert/After Open");
            db.InsertUnit(SiteName, cc, aa, bb);
            Log.d("Stuff","Before Close/After Insert");
            db.close();     
    }

編集

NewStuff を呼び出す onclick 関数

ucreate.setOnClickListener(new OnClickListener(){
        public void onClick(View m){
            Log.d("Ubox","Unit Name: "+uname.getText().toString());
            Log.d("Ubox","Unit Longitude: "+ulon.getText().toString());
            Log.d("Ubox","Unit Latitude: "+ulat.getText().toString());
            Log.d("Ubox","Site Name: "+SiteName);
            NewStuff ns= new NewStuff();
            ns.CreateNewUnit(ulat,ulon,uname,SiteName);
            Intent I= new Intent(Site.this, Site.class);
            I.putExtra("SITE", SiteName);
            startActivity(I);
4

2 に答える 2

1

このようにdbを定義します

public class NewStuff extends Activity {
Context context;
DbM db;

次に onCreate(

onCreate(){
........
   db=new DbM(this); 
}

それが@nandeeshがあなたに伝えようとしていることです。

于 2012-08-30T02:29:49.837 に答える
1

コンテキストが初期化されていないため、DbM をフィールドとして初期化することはできません

 DbM db=new DbM(this);

電話

 db=new DbM(this); 

OnCreate 中または後のみ。

編集:電話することはできません

NewStuff ns= new NewStuff()

これは、自分自身をインスタンス化すると、アクティビティのコンテキストが設定されないためです。したがって、新しい DbM(this);thisの内部。 意味がなくなります。

通常、関数を別のアクティビティからアクティビティとして呼び出すべきではありません。

于 2012-08-30T01:54:23.183 に答える