button을 누르면 다른 activity가 나오게 되고 그것을 저장을 하면 다른 activity에서 DB에 저장한 title 값을 listview에 나오게 됩니다.
그리고 listview의 row를 누르면 저장을 했던 activity가 result 하게 됩니다. 그런데 row를 누르면 애러가 뜨면서 강제 종료가 되고 있습니다.
result 값이 문제인지 아니면 onItemClick 쪽이 문제인지... 아무리 생각을 하고 찾아보고 해도 답이 안나오네요...
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ TodayActivity.class ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public class TodayActivity extends Activity implements OnItemClickListener,OnClickListener { // 오늘의 일정 목록 띄우기
MyDBHelper mDBHelper;
String today;
Cursor cursor;
SimpleCursorAdapter adapter;
ListView list;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.today);
Intent intent = getIntent();
today = intent.getStringExtra("Param1");
TextView title_text = (TextView) findViewById(R.id.texttoday);
title_text.setText(today);
mDBHelper = new MyDBHelper(this);
mDBHelper.open();
cursor = mDBHelper.onSelectDate(today);
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor,
new String[] { "title" }, new int[] { android.R.id.text1, });
ListView list = (ListView) findViewById(R.id.list1);
list.setAdapter(adapter);
list.setOnItemClickListener(this);
mDBHelper.close();
Button btn = (Button) findViewById(R.id.btnadd);
btn.setOnClickListener(this);
}
//list에서 row를 눌렀을 때 생기는 액션
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
// TODO Auto-generated method stub
Intent intent = new Intent(this, ScheduleActivity.class);
cursor.moveToPosition(position);
intent.putExtra("ParamID", cursor.getInt(0));
startActivityForResult(intent, 0);
}
//'+' 버튼을 눌렀을 때 생기는 액션
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(this, ScheduleActivity.class);
intent.putExtra("ParamDate", today);
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
switch (requestCode) {
case 0:
case 1:
if (resultCode == RESULT_OK) {
mDBHelper.open();
cursor = mDBHelper.onSelectDate(today);
adapter.changeCursor(cursor);
mDBHelper.close();
}
break;
}
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ MyDBHelper.class ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
public class MyDBHelper {
private static final String DATABASE_NAME = "Today.db"; // DB 이름
private static final String DATABASE_TABLE = "today"; // DB 테이블 이름
private static final int DATABASE_VERSION = 1; // DB 버전
public static final String KEY_TITLE = "title";
public static final String KEY_POINT = "point";
public static final String KEY_DATE = "date";
public static final String KEY_START_TIME = "startTime";
public static final String KEY_END_TIME = "endTime";
public static final String KEY_MEMO = "memo";
public static final String KEY_MESSAGE = "m_message";
public static final String KEY_ROWID = "_id";
public static final int FIND_BY_TITLE = 1;
public static final int FIND_BY_POINT = 2;
public static final int FIND_BY_DATE = 3;
public static final int FIND_BY_MEMO = 4;
public static final int FIND_BY_START_TIME = 5;
public static final int FIND_BY_END_TIME = 6;
public static final int FIND_BY_MESSAGE = 7;
private final Context mCtx;
private DatabaseHelper mDbHelper;
private static final String TAG = "DateDB";
private SQLiteDatabase db;
// 새로운 테이블을 만드는 sql문
private static final String DATABASE_CREATE = "CREATE TABLE today(_id INTEGER PRIMARY KEY
AUTOINCREMENT, "+ "title TEXT, "+ "point TEXT, "+ "date TEXT, "+ "memo TEXT, "
+ "startTime TEXT, " + "endTime TEXT, " + "m_message TEXT);";
private class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context) {
super(context, 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) {
Log.w(TAG, "Upgrading db from version" + oldVersion + " to"
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); // old 테이블은 버림
onCreate(db); // 새로운 테이블을 만듦
}
}
public MyDBHelper(Context ctx) {
this.mCtx = ctx;
}
public MyDBHelper open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
db = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
mDbHelper.close();
}
public long onInsert(String title, String point, String date, String memo,
String startTime, String endTime, String m_message) { // 레코드 생성
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_POINT, point);
initialValues.put(KEY_DATE, date);
initialValues.put(KEY_START_TIME, startTime);
initialValues.put(KEY_END_TIME, endTime);
initialValues.put(KEY_MEMO, memo);
initialValues.put(KEY_MESSAGE, m_message);
return db.insert(DATABASE_TABLE, null, initialValues);
}
public boolean onDelete(long rowID) { // 레코드 삭제
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowID, null) > 0;
}
public Cursor onSelectAll() { // 모든 레코드 반환
return db.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_TITLE,
KEY_POINT, KEY_DATE, KEY_MEMO, KEY_START_TIME, KEY_END_TIME,
KEY_MESSAGE }, null, null, null, null, null, null);
}
public Cursor onSelect(long rowID) throws SQLException { // 특정 레코드 반환
Cursor mCursor = db.query(true, DATABASE_TABLE,
new String[] { KEY_TITLE, KEY_POINT, KEY_DATE, KEY_START_TIME,
KEY_END_TIME, KEY_MEMO, KEY_MESSAGE }, KEY_ROWID + "="
+ rowID, null, null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor onSelectDate(String date) throws SQLException {
Cursor cursor = db.query(true, DATABASE_TABLE, null, KEY_DATE + "=?",
new String[] { date }, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}
public boolean onUpdate(long rowID, String title, String point,
String date, String memo, String startTime, String endTime, String m_message) { // 레코드 수정
ContentValues args = new ContentValues();
args.put(KEY_TITLE, title);
args.put(KEY_POINT, point);
args.put(KEY_DATE, date);
args.put(KEY_MEMO, memo);
args.put(KEY_START_TIME, startTime);
args.put(KEY_END_TIME, endTime);
args.put(KEY_MESSAGE, m_message);
return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowID, null) > 0;
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ LogCat errorㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
11-08 12:54:32.554: E/AndroidRuntime(1462): FATAL EXCEPTION: main
11-08 12:54:32.554: E/AndroidRuntime(1462): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.calednar/com.android.calednar.ScheduleActivity}: java.lang.NullPointerException
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.ActivityThread.access$600(ActivityThread.java:123)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.os.Looper.loop(Looper.java:137)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.ActivityThread.main(ActivityThread.java:4424)
11-08 12:54:32.554: E/AndroidRuntime(1462): at java.lang.reflect.Method.invokeNative(Native Method)
11-08 12:54:32.554: E/AndroidRuntime(1462): at java.lang.reflect.Method.invoke(Method.java:511)
11-08 12:54:32.554: E/AndroidRuntime(1462): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-08 12:54:32.554: E/AndroidRuntime(1462): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-08 12:54:32.554: E/AndroidRuntime(1462): at dalvik.system.NativeStart.main(Native Method)
11-08 12:54:32.554: E/AndroidRuntime(1462): Caused by: java.lang.NullPointerException
11-08 12:54:32.554: E/AndroidRuntime(1462): at com.android.calednar.ScheduleActivity.updateArray(ScheduleActivity.java:105)
11-08 12:54:32.554: E/AndroidRuntime(1462): at com.android.calednar.ScheduleActivity.dbList(ScheduleActivity.java:95)
11-08 12:54:32.554: E/AndroidRuntime(1462): at com.android.calednar.ScheduleActivity.onCreate(ScheduleActivity.java:67)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.Activity.performCreate(Activity.java:4465)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-08 12:54:32.554: E/AndroidRuntime(1462): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
11-08 12:54:32.554: E/AndroidRuntime(1462): ... 11 more
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
button을 누르면 다른 activity가 나오게 되고 그것을 저장을 하면 다른 activity에서 DB에 저장한 title 값을 listview에 나오게 됩니다.
그리고 listview의 row를 누르면 저장을 했던 activity가 result 하게 됩니다. <- 잘 이해가 가지 않네요;;
음.. 추리를 위해 3개의 가정 액티비티를 추정했는데 각각 startActivity,A Activity,B Activity 라고 한다면
start activity <- 이게 버튼이 있어서 A액티비티를 부르는 액티비티인가요??
A activity < - 아마도 ScheduleActivity 인듯한데 저장을 하게 되면 내용을 DB에 넣고 B를 호출하는 액티비티인가요?
B activity <- DB에서 타이틀만 불러와서 리스트뷰에 넣는 액티비티인듯한데 이게 TodayActivity인건가요? 여기서 row를 누르면
A activity가 다시 불려져 와서 해당 title에 맞는 DB를 긁어와 뿌려주는 게 맞는지요?
11-08 12:54:32.554: E/AndroidRuntime(1462): Caused by: java.lang.NullPointerException
11-0812:54:32.554:E/AndroidRuntime(1462):a t com.android.calednar.ScheduleActivity.updateArray(ScheduleActivity.java:105)
11-08 12:54:32.554: E/AndroidRuntime(1462): at com.android.calednar.ScheduleActivity.dbList(ScheduleActivity.java:95)
위 로그캣을 보면 ScheduleActivity안의 updateArray가 널포인트라고 뜨는건데..
dblist()라는 함수에서 db목록을 긁어 오는 건가요? 여튼.. 예상되는 문제는 위에 올리신 코드가 아닌 ScheduleActivity안에서
일어나는 문제인데 어레이 값 확인하해보심이...
질문 이해하기가 너무 어렵고.. 로그캣을 보면 그리 큰 문제는 아닌듯한데... 흐음..