2011-03-16 6 views
1

글쎄, 사용자가 메모를 연락처에 저장할 수있는 간단한 앱을 개발하고 있습니다. 전화에서 연락처를 나열합니다. 사용자가 연락처를 클릭하면 연락처 ID를 기반으로 연락처와 관련된 메모 항목이 표시됩니다. 그런 다음 메뉴> 메모 추가를 사용하여 새 메모를 추가 할 수 있습니다. 나는 응용 프로그램을 통해 모든 방법을 얻을 수 있지만 그것은 양식에 입력 된 데이터를 데이터베이스에 저장되지 않습니다. 저장하려고하면 Null Pointer Exception이 발생합니다. 충돌이 없으며 이전 활동으로 돌아가고 아무 것도하지 않습니다. 나는 프로그래밍에 익숙하지 않고 지난 1 년 반 동안 안드로이드를 가르쳐 왔기 때문에 정말 간단 할 수 있습니다. 나는 웹 주위를 파고 자주 스택 오버플로에 대한 답변을 확인하지만 어차피이 하나에 아무것도 찾을 것 같다. 또한 어떤 코드가 필요한지 잘 모르겠습니다. 따라서 양식 활동과 dbadapter에 대한 코드를 게시 할 것입니다. 어떤 도움을 주셔서 미리 감사드립니다! Android 개발 - 데이터베이스 삽입시 null 포인터 예외가 발생했습니다.

는 데이터를 입력하는 데 사용되는 활동입니다 :

package com.onyx.formapp23; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import com.onyx.formapp23.MyDbAdapter; 

public class FormsNewNote extends Activity { 
    String mIntentString; 
    int contactId; 
    EditText contactIdEdit, titleEdit, bodyEdit; 
    long dateTimeValue; 
    Button submitBtn, discardBtn; 
    private MyDbAdapter db = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.forms_newnote); 
     Bundle extras = getIntent().getExtras(); 
     mIntentString = extras.getString("contactId"); 
     db = new MyDbAdapter(this); 
     contactIdEdit = (EditText) findViewById(R.id.noteFormContactId); 
     contactIdEdit.setText(mIntentString); 
     contactId = Integer.parseInt(mIntentString); 
     titleEdit = (EditText) findViewById(R.id.noteFormTitle); 
     bodyEdit = (EditText) findViewById(R.id.noteFormBody); 
     dateTimeValue = java.lang.System.currentTimeMillis(); 
     submitBtn = (Button) findViewById(R.id.noteFormSave); 
     discardBtn = (Button) findViewById(R.id.noteFormDiscard); 
     submitBtn.setOnClickListener(new OnClickListener(){ 
      @Override 
      public void onClick(View v) { 
       try{ 
        String titleInsert = titleEdit.getText().toString(); 
        String bodyInsert = bodyEdit.getText().toString(); 
        db.createNote(contactId, titleInsert, bodyInsert, dateTimeValue); 
       } catch (Exception e) { 
        String titleInsert = titleEdit.getText().toString(); 
        String bodyInsert = bodyEdit.getText().toString(); 
        e.printStackTrace(); 
        Context context = getApplicationContext(); 
        CharSequence text = "SQL Exception Thrown: " + e + "\nTitle: " + titleInsert + "\nBody: " + bodyInsert; 
        int duration = Toast.LENGTH_SHORT; 
        Toast toast = Toast.makeText(context, text, duration); 
        toast.show(); 
       } 
       finish(); 
      } 
     }); 
    } 


} 

이 내 DB 어댑터 클래스입니다 :

package com.onyx.formapp23; 

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

public class MyDbAdapter { 
    private DatabaseHelper mDbHelper; 
    private SQLiteDatabase mDb; 

    public static final String KEY_TITLE = "title"; 
    public static final String KEY_BODY = "body"; 
    public static final String KEY_CONTACTID = "contactId"; 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_DATETIME = "datetime"; 
    private static final String TAG = "MyDbAdapter"; 
    private static final String DATABASE_CREATE = 
     "create table contactNotes (_id integer primary key autoincrement, contactId integer, title text not null, body text not null, datetime long);"; 

    private static final String DATABASE_NAME = "OnyxDatabase"; 
    private static final String DATABASE_TABLE = "contactNotes"; 
    private static final int DATABASE_VERSION = 1; 

    private final Context mCtx; 

    private static class DatabaseHelper extends SQLiteOpenHelper { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 
     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(DATABASE_CREATE); 
     } 
     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS notes"); 
      onCreate(db); 
     } 
    } 
    public MyDbAdapter(Context ctx) { 
     this.mCtx = ctx; 
    } 
    public MyDbAdapter open() throws SQLException { 
     mDbHelper = new DatabaseHelper(mCtx); 
     mDb = mDbHelper.getWritableDatabase(); 
     return this; 
    } 
    public void close() { 
     mDbHelper.close(); 
    } 
    public long createNote(int contactId, String title, String body, long datetime) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_CONTACTID, contactId); 
     initialValues.put(KEY_TITLE, title); 
     initialValues.put(KEY_BODY, body); 
     initialValues.put(KEY_DATETIME, datetime); 
     return mDb.insertOrThrow(DATABASE_TABLE, null, initialValues); 
    } 

    public void createNote2(int contactId, String title, String body) { 
     mDb.execSQL("insert into " + DATABASE_TABLE + " (" + KEY_CONTACTID + ", " + KEY_TITLE + ", " + KEY_BODY + ", " + KEY_DATETIME + ") values(" + contactId + ", " + 
       title + ", " + body + ", " + java.lang.System.currentTimeMillis() + ");"); 
    } 

    public boolean deleteNote(long rowId) { 
     return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
    } 
    public Cursor fetchAllNotes() { 
     return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, KEY_CONTACTID, 
       KEY_BODY, KEY_DATETIME}, null, null, null, null, null); 
    } 
    public Cursor fetchNotesForContact(String contactId) { 
     return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_CONTACTID, KEY_TITLE, KEY_BODY, KEY_DATETIME}, KEY_CONTACTID + " = " + contactId, null, null, null, new String (KEY_DATETIME + 
       " COLLATE LOCALIZED ASC")); 
    } 
    public Cursor fetchNote(long rowId) throws SQLException { 
     Cursor mCursor = 
      mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
        KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null, 
        null, null, null, null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 
    public boolean updateNote(long rowId, String title, String body) { 
     ContentValues args = new ContentValues(); 
     args.put(KEY_TITLE, title); 
     args.put(KEY_BODY, body); 

     return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
    } 
} 

그리고 여기 이클립스 디버그에서 추적입니다 :

Thread [<1> main] (Suspended (entry into method createNote in MyDbAdapter)) 
    MyDbAdapter.createNote(int, String, String, long) line: 58 
    FormsNewNote$1.onClick(View) line: 43 
    Button(View).performClick() line: 2447 
    View$PerformClick.run() line: 9025 
    ViewRoot(Handler).handleCallback(Message) line: 587 
    ViewRoot(Handler).dispatchMessage(Message) line: 92 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4628  
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
    Method.invoke(Object, Object...) line: 521 
    ZygoteInit$MethodAndArgsCaller.run() line: 870 
    ZygoteInit.main(String[]) line: 628 
    NativeStart.main(String[]) line: not available [native method] 

답변

11

어디에서나 MyDbAdapter.open()을 호출하는 것처럼 보이지 않으므로 createNote()에서 mDb가 null입니다.

+1

감사합니다. open()을 추가하면 데이터베이스에 저장하는 데 문제가 해결되었습니다. 나는 커서에서 데이터를 가져 오는 데 문제가있어서 DB를 당기고 SQLite Browser를 통해 저장하는 것처럼 저장하지 않는 것처럼 보였으므로 처음에는 그것을 잡을 필요가 없었습니다. 저장 중입니다. 당신의 도움을 주셔서 감사합니다! –

+0

디버거 콘솔에서 그 사실을 알 수없는 이유는 무엇입니까? – neobie

관련 문제