2016-06-29 10 views
0

私はSQLiteでシンプルなノートアプリケーションを作っています。 SQLiteには2つのアクティビティとヘルパークラスがあります。しかし、MainActivity.javaのサンプルノート(Akhilesh Chobey)をクリックし、Main2Activity.javaで編集しようとすると、アプリケーションがクラッシュします。onTextChanged()中にクラッシュするアプリケーション

主な活動:

public class MainActivity extends AppCompatActivity { 



    ListView notesListView; 
    static ArrayList<String> notesArrayList; 
    ArrayAdapter<String> adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     notesListView = (ListView) findViewById(R.id.notesListView); 
     notesArrayList = new ArrayList<String>(); 
     notesArrayList.add("Akhilesh Chobey"); 
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, notesArrayList); 
     notesListView.setAdapter(adapter); 

     notesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Intent intent = new Intent(getApplicationContext(), Main2Activity.class); 
       intent.putExtra("notePosition", i); 
       startActivity(intent); 
      } 
     }); 



    } 
} 

Main2Activity:

public class Main2Activity extends AppCompatActivity implements TextWatcher { 

DatabaseOperations myDB; 
EditText editNote; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    editNote = (EditText) findViewById(R.id.noteEditText); 

    myDb = new DatabaseOperations(Main2Activity.this); 

    Intent intent = getIntent(); 
    int position = intent.getIntExtra("notePosition", -1); 
    if(position != -1){ 

     editNote.setText(MainActivity.notesArrayList.get(position)); 

    } 
    editNote.addTextChangedListener(this); 
} 
@Override 
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
    if (myDB == null){ 
    boolean isInserted = myDB.insertData(editNote.getText().toString()); 
     if(isInserted){ 
      Toast.makeText(getApplicationContext(), "Inserted", Toast.LENGTH_SHORT).show(); 
     }else { 
      Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show(); 
    } 
} 
} 

ヘルパークラス:

public class DatabaseOperations extends SQLiteOpenHelper { 

public static final String DatabaseName = "notes.db"; 
public static final String TableName = "notes"; 
public static final String Col1 = "text"; 

public DatabaseOperations(Context context) { 
    super(context, DatabaseName, null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + TableName + " (text TEXT PRIMARY KEY AUTOINCREMENT) "); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int i, int i1) { 

    db.execSQL("DROP TABLE IF EXISTS " + TableName); 
    onCreate(db); 

} 

public boolean insertData(String note){ 

    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(Col1, note); 

    long result = db.insert(TableName, null, contentValues); 
    if(result == -1){ 
     return false; 
    }else { 
     return true; 
    } 

} 

} 

ログイン:

06-29 17:23:34.996 2231-2231/com.akhileshchobey.mynotes E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.akhileshchobey.mynotes, PID: 2231 
                     java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.akhileshchobey.mynotes.DatabaseOperations.insertData(java.lang.String)' on a null object reference 
                      at com.akhileshchobey.mynotes.Main2Activity.onTextChanged(Main2Activity.java:39) 
                      at android.widget.TextView.sendOnTextChanged(TextView.java:7746) 
                      at android.widget.TextView.handleTextChanged(TextView.java:7806) 
                      at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9724) 
                      at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:964) 
                      at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:515) 
                      at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454) 
                      at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33) 
                      at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:685) 
                      at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:445) 
                      at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:340) 
                      at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5264) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695) 
+0

は –

+0

あなたのlogcatメッセージを貼り付け、あなたのlogcatを投稿してください。 –

+1

あなたの 'Main2Activity'クラスで' myDb'を初期化していないかもしれません。だから** NULL ** – SripadRaj

答えて

2

あなたはそれが今、あなたのmyDbを初期化し、しているあなたのMain2Activity

myDb = new DatabaseOperations(Main2Activity.this); 

EDIT

のごonCreate()にこのようmyDbを初期化し、myDb = null;を初期化しないでください。 nullにはなりません。ですので、onTextChanged()メソッドで以下のように変更する必要があります。

if (myDB != null) 

if (myDB == null) 

+0

ありがとうございます。できます。 Main2Activityのコードを更新しました。しかし、トーストは表示されていません。それはなぜそうですか? –

+0

@AkhileshChobey更新私の答え – SripadRaj

+1

はい。ありがとう。 'ヘルパークラス'の 'AUTOINCREMENT'を削除しなければならなかった場合 –

0

初期化していませんDatabaseOperations myDB = null;

以下の行には、NULLポインタ例外を指定する必要があります。あなたは

+0

私はそれを初期化しましたが、それはまだ同じものを示しています。 –

+0

myDBの初期化はどこですか? –

+0

更新されたコードはどこにmyDBが初期化されていないのですか? –

0

myDBmyDBを初期化していないため

boolean isInserted = myDB.insertData(editNote.getText().toString()); 

が初期化されていません。あなたはそれを使用する前にそれを初期化する必要があります。ヌルオブジェクトでinsertDataを呼び出すのは、アプリがクラッシュする理由です。

1

boolean isInserted = myDB.insertData(editNote.getText().toString());の行を以下のように安全ヌルチェックで変更してください。

if (myDB == null) 
    myDB = new DatabaseOperations(getApplicationContext()); //Initialization 
boolean isInserted = myDB.insertData(editNote.getText().toString()); 
+0

で起こっていることを見つけることができませんが、なぜこの余分なif()条件が必要なのですか? –

+0

どこかで初期化されるかもしれませんが(myDB)、このステップでは、 'myDB'がnullのためにクラッシュします。このチェックを追加すると、クラッシュしません。あなたの右の彼は、その本機能では、あなたが言ったように私がやった – Mani

+0

。それを確認するコードを見てください。しかし、それはまだクラッシュします。 –

関連する問題