마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

SQLite에서 Drop table을 사용하니까 에러가 납니다;;

0 추천

SQLite를 이용해서 처음에 테이블을 생성하고, 그리고 값 초기화 할 때, 테이블값을 초기화 하기 보다는 테이블을 삭제해버리는게 좋을거 같아서 drop table if exists table_name; 이런식으로 쿼리를 입력하였는데 자꾸 에러가 나네요..

아무리 구글링을해봐도 답이 안나옵니다. 도와주세요 ㅠㅠ

 

 

 

database관련 class입니다.

여기서 dropTable()이 테이블을 삭제하는 메소드입니다.

public class DataBaseAdapter {
	// table에 들어갈 속성값
        ....

	// DataBaseHelper와 SQLDatabase객체 정의(SQLiteDatabase : 추가, 삭제, 쿼리, 수정과 관련)
	private DataBaseHelper mDBHelper;
	private SQLiteDatabase mDB;

	// Create Table 정의
	private static final String DB_CREATE = "create table userinfo (id integer primary key autoincrement,"
			+ "name text not null, sex text, year Integer, height Integer, weight Integer, loss_weight Integer, avg_weight Integer, bm Integer, bmi Integer);";

	// SQLiteOpenHelper Values
	private static final String DATABASE_NAME = "checkmybody.db";
	private static final String DATABASE_TABLE = "userinfo";
	private static final int DATABASE_VERSION = 1;

	private final Context mContext;

	// SQLiteOpenHelper 정의(SQLiteOpenHelper : 생성, 열기, 업데이트와 관련)
	private class DataBaseHelper extends SQLiteOpenHelper {

		public DataBaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		// table 생성
		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DB_CREATE);
		}

		// db업데이트
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
			onCreate(db);
		}
	}

	public DataBaseAdapter(Context context) {
		mContext = context;
	}

	// DB열기
	public DataBaseAdapter open() throws SQLException {
		mDBHelper = new DataBaseHelper(mContext);
		mDB = mDBHelper.getWritableDatabase();
		return this;
	}

	// DB 닫기
	public void close() {
		mDBHelper.close();
	}

	// 테이블 삭제
	public void dropTable() {
		mDB.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE+";");
	}

	// 필드값 insert
	public long insertUserInfo(String name, String sex, float year,
			float height, float weight, float lossWeihgt, float avgWeight,
			float BM, float BMI) {
		ContentValues initialValues = new ContentValues();
		initialValues.put(KEY_NAME, name);
		initialValues.put(KEY_SEX, sex);
		initialValues.put(KEY_YEAR, year);
		initialValues.put(KEY_HEIGHT, height);
		initialValues.put(KEY_WEIHGT, weight);
		initialValues.put(KEY_LOSS_WEIGHT, lossWeihgt);
		initialValues.put(KEY_AVG_WEIGHT, avgWeight);
		initialValues.put(KEY_BM, BM);
		initialValues.put(KEY_BMI, BMI);

		return mDB.insert(DATABASE_TABLE, null, initialValues);
	}
        ...
}

 

dropTable을 실행시키는 class입니다.

public class SettingFragment extends PreferenceFragment {
	private ValueManager vm = ValueManager.getInstance();
	private DataBaseAdapter mDBAdapter = new DataBaseAdapter(getActivity());
	
	private Preference init;	
	
	// default
	private static final String SECTION_NUMBER = "section number";
	
	public static SettingFragment newInstance(int sectionNumber) {
		SettingFragment fragment = new SettingFragment();
		Bundle args = new Bundle();
		args.putInt(SECTION_NUMBER, sectionNumber);
		fragment.setArguments(args);
		return  fragment;
	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		((MainActivity) activity).onSectionAttached(getArguments().getInt(SECTION_NUMBER));
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.fragment_setting);
		init = (Preference) findPreference("setting_init");
		init.setOnPreferenceClickListener(new OnPreferenceClickListener() {
			
			@Override
			public boolean onPreferenceClick(Preference preference) {
 				mDBAdapter.dropTable();
				
				vm.ui_editor.clear();
				vm.ui_editor.commit();
				Intent intent = new Intent(getActivity(), StartActivity.class);
				getActivity().finish();
				startActivity(intent);
				
				return false;
			}
		});
	}
}

 

두 클래스는 따로 만들었습니다.

 

 

이것은 에러났을때의 log입니다.

08-11 01:21:19.348: E/AndroidRuntime(14395): FATAL EXCEPTION: main
08-11 01:21:19.348: E/AndroidRuntime(14395): Process: com.example.checkmybody, PID: 14395
08-11 01:21:19.348: E/AndroidRuntime(14395): java.lang.NullPointerException
08-11 01:21:19.348: E/AndroidRuntime(14395): at lee.sh.checkmybody.common.DataBaseAdapter.dropTable(DataBaseAdapter.java:77)
08-11 01:21:19.348: E/AndroidRuntime(14395): at com.example.checkmybody.SettingFragment$1.onPreferenceClick(SettingFragment.java:46)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.preference.Preference.performClick(Preference.java:954)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:250)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.widget.AdapterView.performItemClick(AdapterView.java:299)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.widget.AbsListView.performItemClick(AbsListView.java:1150)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2960)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.widget.AbsListView$3.run(AbsListView.java:3708)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.os.Handler.handleCallback(Handler.java:733)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.os.Handler.dispatchMessage(Handler.java:95)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.os.Looper.loop(Looper.java:136)
08-11 01:21:19.348: E/AndroidRuntime(14395): at android.app.ActivityThread.main(ActivityThread.java:5068)
08-11 01:21:19.348: E/AndroidRuntime(14395): at java.lang.reflect.Method.invokeNative(Native Method)
08-11 01:21:19.348: E/AndroidRuntime(14395): at java.lang.reflect.Method.invoke(Method.java:515)
08-11 01:21:19.348: E/AndroidRuntime(14395): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
08-11 01:21:19.348: E/AndroidRuntime(14395): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
08-11 01:21:19.348: E/AndroidRuntime(14395): at dalvik.system.NativeStart.main(Native Method)
익명사용자 님이 2014년 8월 11일 질문

2개의 답변

0 추천

로그 앞 부분의 불필요한 부분은 지우고 올려주세요...

FATAL EXCEPTION: main
Process: com.example.checkmybody, PID: 14395
java.lang.NullPointerException
 at lee.sh.checkmybody.common.DataBaseAdapter.dropTable(DataBaseAdapter.java:77)
 at com.example.checkmybody.SettingFragment$1.onPreferenceClick(SettingFragment.java:46)
 at android.preference.Preference.performClick(Preference.java:954)
 at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:250)
 at android.widget.AdapterView.performItemClick(AdapterView.java:299)
 at android.widget.AbsListView.performItemClick(AbsListView.java:1150)
 at android.widget.AbsListView$PerformClick.run(AbsListView.java:2960)
 at android.widget.AbsListView$3.run(AbsListView.java:3708)
 at android.os.Handler.handleCallback(Handler.java:733)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:136)
 at android.app.ActivityThread.main(ActivityThread.java:5068)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:515)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
 at dalvik.system.NativeStart.main(Native Method)

이러면 답변달아줄 사람들이 보기 편하죠.

 

java.lang.NullPointerException
 at lee.sh.checkmybody.common.DataBaseAdapter.dropTable(DataBaseAdapter.java:77)
 at com.example.checkmybody.SettingFragment$1.onPreferenceClick(SettingFragment.java:46)

 

DataBaseAdapter.java:77에 null 값이 있다고 하네요 

쎄미 (162,410 포인트) 님이 2014년 8월 11일 답변
옛날꺼지만, 혹시나 해서 그냥 달아 놓으면... (구글 검색에서 상위권에 올라오니깐..)
주어진 코드 상으로만 보면 open() 콜을 안하셨습니다.
그러니 초기화 안된 mDB 접근하다가 null-참조 에러가 나지요..
0 추천
옛날꺼지만, 혹시나 해서 그냥 달아 놓으면... (구글 검색에서 상위권에 올라오니깐..)
주어진 코드 상으로만 보면 open() 콜을 안하셨습니다.
그러니 초기화 안된 mDB 접근하다가 null-참조 에러가 나지요..

물론 초기화를 했다고 해도, 드롭 테이블 이후에 다시 테이블을 생성시키는 구문도 없어서 (onCreate때만 불리는데 그건 정말로 파일이 처음 생겼을때만 불립니다.) 이후에 인서트 하고 뭐 하는 것들 다 안될겁니다.
Xavier 님이 2017년 11월 24일 답변
...