안드로이드 개발 질문/답변
(글 수 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



