안드로이드 개발 질문/답변
(글 수 45,052)
NotePad 예제를 수정해가면서 Database 공부를 하던중입니다..
기존의 Notepad에 SubTitle라는 사용자 입력 스트링을 받을수 있는
EditText 하나를 더 추가해.. data에 넣는 작업을 하던중.. 널포인트익셉션 오류가 떠버렷습니다..ㅠㅠ
소스 코드에.. 어디가 잘못된것일까요..
우선은 NoteEdit.java 파일..
NotePadDbAdapter.java
그리고 LogCat입니다..
기존의 Notepad에 SubTitle라는 사용자 입력 스트링을 받을수 있는
EditText 하나를 더 추가해.. data에 넣는 작업을 하던중.. 널포인트익셉션 오류가 떠버렷습니다..ㅠㅠ
소스 코드에.. 어디가 잘못된것일까요..
우선은 NoteEdit.java 파일..
import android.app.*; import android.database.*; import android.os.*; import android.util.*; import android.view.*; import android.view.View.*; import android.widget.*; public class NoteEdit extends Activity { private final String tag ="NoteEdit"; private EditText mTitle, mSubTitle, mContent; private Long mRowId; private NotesDbAdapter mDbHelper; private Button mInsert, mCancel; private OnClickListener mClick; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.edit); mTitle = (EditText) findViewById(R.id.Edit_TitleText); mSubTitle = (EditText) findViewById(R.id.Edit_SubTitleText); mContent = (EditText) findViewById(R.id.Edit_ContentText); mInsert = (Button) findViewById(R.id.Edit_InsetButton); mCancel = (Button) findViewById(R.id.Edit_CancelButton); Log.d(tag, "mRowId if befor"); mRowId = (savedInstanceState == null) ? null : (Long) savedInstanceState.getSerializable(NotesDbAdapter.KEY_ROWID); if(mRowId == null){ Bundle extras = getIntent().getExtras(); mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) : null; } populateFields(); mClick = new OnClickListener(){ @Override public void onClick(View v) { switch(v.getId()) { case R.id.Edit_InsetButton : setResult(RESULT_OK); finish(); break; case R.id.Edit_CancelButton : finish(); break; } }}; mInsert.setOnClickListener(mClick); mCancel.setOnClickListener(mClick); } private void populateFields(){ Log.d(tag, "populateFields"); if(mRowId != null){ Cursor note = mDbHelper.fetchNote(mRowId); startManagingCursor(note); mTitle.setText(note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE))); mSubTitle.setText(note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_SUBTITLE))); mContent.setText(note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_CONTENT))); } } @Override protected void onSaveInstanceState(Bundle outState) { Log.d(tag, "onSaveInstanceState"); saveState(); super.onSaveInstanceState(outState); } @Override protected void onPause() { Log.d(tag, "onPause"); saveState(); super.onPause(); } @Override protected void onResume() { Log.d(tag, "onResume"); populateFields(); super.onResume(); } private void saveState(){ Log.d(tag, "saveState"); String title = mTitle.getText().toString(); String subtitle = mSubTitle.getText().toString(); String content = mContent.getText().toString(); if(mRowId == null) { long id = mDbHelper.createNote(title, subtitle, content); if(id > 0){ mRowId = id; } }else{ mDbHelper.updateNote(mRowId, title, subtitle, content); } } }
NotePadDbAdapter.java
package kwh.cu.NotePad; import android.content.*; import android.database.*; import android.database.sqlite.*; public class NotesDbAdapter{ public static final String KEY_TITLE = "title"; public static final String KEY_SUBTITLE = "subtitle"; public static final String KEY_CONTENT = "content"; public static final String KEY_ROWID = "_id"; public static final String TAG = "NotesDbAdapter"; private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; private static final String DATABASE_CREATE = "create table notes (_id integer primary key autoincrement, " + "title text not null, subtitle text not null, content text not null);"; private static final String DATABASE_NAME = "data"; private static final String DATABASE_TABLE = "notes"; private static final int DATABASE_VERSION = 1; private final Context mCtx; private static class DatabaseHelper extends SQLiteOpenHelper{ public DatabaseHelper(Context contex) { super(contex, DATABASE_NAME, null, DATABASE_VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS ontes"); onCreate(db); } } public NotesDbAdapter(Context ctx) { this.mCtx = ctx; } public NotesDbAdapter open() throws SQLException{ mDbHelper = new DatabaseHelper(mCtx); mDb = mDbHelper.getWritableDatabase(); return this; } public void close(){ mDbHelper.close(); } public long createNote(String title, String subtitle, String content){ ContentValues initialValues = new ContentValues(); initialValues.put(KEY_TITLE, title); initialValues.put(KEY_SUBTITLE, subtitle); initialValues.put(KEY_CONTENT, content); return mDb.insert(DATABASE_TABLE, null, initialValues); } 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_SUBTITLE, KEY_CONTENT}, null, null, null, null, null); } public Cursor fetchNote(long rowId) throws SQLException{ Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, KEY_SUBTITLE, KEY_CONTENT}, KEY_ROWID + "=" + rowId, null, null, null,null,null); if(mCursor !=null){ mCursor.moveToFirst(); } return null; } public boolean updateNote(long rowId, String title, String subtitle, String content) { ContentValues args = new ContentValues(); args.put(KEY_TITLE, title); args.put(KEY_SUBTITLE, subtitle); args.put(KEY_CONTENT, content); return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; } }
그리고 LogCat입니다..
02-11 07:33:49.243: DEBUG/NoteEdit(302): saveState 02-11 07:33:49.273: DEBUG/AndroidRuntime(302): Shutting down VM 02-11 07:33:49.283: WARN/dalvikvm(302): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): FATAL EXCEPTION: main 02-11 07:33:49.343: ERROR/AndroidRuntime(302): java.lang.RuntimeException: Unable to pause activity {kwh.cu.NotePad/kwh.cu.NotePad.NoteEdit}: java.lang.NullPointerException 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3348) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3305) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3288) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.ActivityThread.access$2500(ActivityThread.java:125) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.os.Handler.dispatchMessage(Handler.java:99) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.os.Looper.loop(Looper.java:123) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.ActivityThread.main(ActivityThread.java:4627) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at java.lang.reflect.Method.invokeNative(Native Method) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at java.lang.reflect.Method.invoke(Method.java:521) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at dalvik.system.NativeStart.main(Native Method) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): Caused by: java.lang.NullPointerException 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at kwh.cu.NotePad.NoteEdit.saveState(NoteEdit.java:106) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at kwh.cu.NotePad.NoteEdit.onPause(NoteEdit.java:85) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.Activity.performPause(Activity.java:3842) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1190) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3335) 02-11 07:33:49.343: ERROR/AndroidRuntime(302): ... 12 more