안녕하십니까, 그동안 안드로이드펍 통해서 독학으로 안드로이드 공부하고 있는 학생입니다.

공부하다 막히는 부분이 있어서 답답한 마음에 글을 처음으로 올립니다.


결론부터 말씀드리면,


리스트뷰 위에 올라온 테이블의 레코드들을 longClick을 해서 삭제할 수 있도록 처리를 했는데, 

에뮬레이터를 종료하고 다시 실행시키면 원상복구가 됩니다.

글제목 그대로 레코드가 계속 중첩되어서 실행됩니다. 레코드를 지웠으면 지운 상태로 저장되어야 하는데 그렇지가 않더라고요.


전체 코드, 실행화면, 에러코드는 파일로 첨부해두었습니다.

참, 이번에 공부하는데 참고한 자료는 이곳에서 받았습니다.

http://arabiannight.tistory.com/category/Android/DataBase




레코드를 생성하는 문장은 아래와 같습니다.

public class TestDataBaseActivity extends Activity {


//DB를 사용하는 ACTIVITY 화면

//실제 사용자가 DB에 DATA를 저장, 삭제, 갱신, 조회 등의 작업을 수행하는 클래스.

private static final String TAG = "TestDataBaseActivity";

private DbOpenHelper mDbOpenHelper;

private Cursor mCursor;

private InfoClass mInfoClass;

private ArrayList<InfoClass> mInfoArray;

private CustomAdapter mAdapter;


@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


setLayout();


// DB Create and Open

mDbOpenHelper = new DbOpenHelper(this);

mDbOpenHelper.open();

mDbOpenHelper.insertColumn("2AM", "노래1", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2AM", "노래2", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2PM", "노래3", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2PM", "노래4", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2NE1", "노래5", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");


       startManagingCursor(mCursor);


mInfoArray = new ArrayList<InfoClass>();


doWhileCursorToArray();


for(InfoClass i : mInfoArray){

DLog.d(TAG, "ID = " + i._id);

DLog.d(TAG, "artist = " + i.artist);

DLog.d(TAG, "songname = " + i.songname);

DLog.d(TAG, "urladdress = " + i.urladdress);

}


mAdapter = new CustomAdapter(this, mInfoArray);

mListView.setAdapter(mAdapter);

mListView.setOnItemLongClickListener(longClickListener);


}


@Override

protected void onDestroy() {

mDbOpenHelper.close();

super.onDestroy();

}



/**

* ListView의 Item을 롱클릭 할때 호출 ( 선택한 아이템의 DB 컬럼과 Data를 삭제 한다. )

*/

private OnItemLongClickListener longClickListener = new OnItemLongClickListener() {

public boolean onItemLongClick(AdapterView<?> arg0, View arg1,

int position, long arg3) {


DLog.e(TAG, "position = " + position);//태그: 삭제대상인 컬럼의 position

InfoClass infoClass = mInfoArray.get(position);

int id = infoClass._id;

//DB헬퍼클래스는 데이터베이스 생성, 관리를 돕는다. array에 있는 getPosition에 해당하는 컬럼을 삭제함.

boolean result = mDbOpenHelper.deleteColumn(id);;


DLog.e(TAG, "result = " + result);//태그: 컬럼을 삭제하면 result를 띄움.


if(result){

mInfoArray.remove(position);//array 안에 있는 position이 제거됨.

mAdapter.setArrayList(mInfoArray);

mAdapter.notifyDataSetChanged();

}else {

// Toast.makeText(getApplicationContext(), "INDEX를 확인해 주세요.", 

// Toast.LENGTH_LONG).show();

}


return false;

}

};



문법상으로는 오류가 없어서 원인이 뭔지 생각해봤는데

제 생각에는 DbOpenHelper클래스의 onCreate 안에서 insertColumn을 하지 않아서 그런 듯 싶습니다.

public class DbOpenHelper {

//DatabaseHelper(DB생성 및 관리를 도움)

private static final String DATABASE_NAME = "ktube.db";

private static final int DATABASE_VERSION = 1;

public static SQLiteDatabase mDB;

private DatabaseHelper mDBHelper;

private Context mCtx;

private DbOpenHelper mDbOpenHelper;

private class DatabaseHelper extends SQLiteOpenHelper{


// 생성자

public DatabaseHelper(Context context, String name,

CursorFactory factory, int version) {

super(context, name, factory, version);

}


// 최초 DB를 만들때 한번만 호출된다.

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(DataBases.CreateDB._CREATE);


}



문제는 제가 코드를 어떻게 작성해야 할지 몰라서 막막합니다.


문제를 해결해보려고 이 문장을

mDbOpenHelper.insertColumn("2AM", "노래1", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2AM", "노래2", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2PM", "노래3", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2PM", "노래4", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1");

mDbOpenHelper.insertColumn("2NE1", "노래5", "http://www.youtube.com/v/-sM5IWBkhtw?version=3&amp;autohide=1"); 


openHelper 클래스의 onCreate에 옮겨놓고 실행하니까 런타임 익셉션 에러가 터집니다-_-;



07-09 11:58:10.946: E/AndroidRuntime(656): FATAL EXCEPTION: main

07-09 11:58:10.946: E/AndroidRuntime(656): java.lang.RuntimeException: Unable to start activity ComponentInfo{arabiannight.tistory.com/arabiannight.tistory.com.activity.TestDataBaseActivity}: java.lang.NullPointerException

07-09 11:58:10.946: E/AndroidRuntime(656): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.app.ActivityThread.access$1500(ActivityThread.java:117)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.os.Handler.dispatchMessage(Handler.java:99)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.os.Looper.loop(Looper.java:130)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.app.ActivityThread.main(ActivityThread.java:3683)

07-09 11:58:10.946: E/AndroidRuntime(656): at java.lang.reflect.Method.invokeNative(Native Method)

07-09 11:58:10.946: E/AndroidRuntime(656): at java.lang.reflect.Method.invoke(Method.java:507)

07-09 11:58:10.946: E/AndroidRuntime(656): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

07-09 11:58:10.946: E/AndroidRuntime(656): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

07-09 11:58:10.946: E/AndroidRuntime(656): at dalvik.system.NativeStart.main(Native Method)

07-09 11:58:10.946: E/AndroidRuntime(656): Caused by: java.lang.NullPointerException

07-09 11:58:10.946: E/AndroidRuntime(656): at arabiannight.tistory.com.database.DbOpenHelper$DatabaseHelper.onCreate(DbOpenHelper.java:35)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126)

07-09 11:58:10.946: E/AndroidRuntime(656): at arabiannight.tistory.com.database.DbOpenHelper.open(DbOpenHelper.java:62)

07-09 11:58:10.946: E/AndroidRuntime(656): at arabiannight.tistory.com.activity.TestDataBaseActivity.onCreate(TestDataBaseActivity.java:43)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

07-09 11:58:10.946: E/AndroidRuntime(656): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

07-09 11:58:10.946: E/AndroidRuntime(656): ... 11 more







초보 학생에게 가르침 좀 주세요~!

가이드 라인도 좋고, 직접 소스 주시면 더욱 감사하겠습니다.